Use CustomAdapter to change how ListView is displayed
Asked Answered
C

2

2

My XML that I would like to use for custom adapter:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity"
    android:background="@drawable/bginset3" >
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal"
            android:paddingTop="10dp"
            android:paddingBottom="10dp"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            android:background="@drawable/forfileicon" >
            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@android:color/white" >
                <ImageView
                    android:id="@+id/imgFileIcon"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/ic_launcher"
                    android:background="@drawable/forfileicon" />
                <TextView
                    android:id="@+id/tvFN"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text=""
                    android:textStyle="bold"
                    android:paddingTop="10dp"
                    android:textColor="#00A21E"
                    android:textSize="14dp"
                    android:paddingLeft="25dp"
                    android:layout_toRightOf="@+id/imgFileIcon" />
                <TextView
                    android:id="@+id/tvMD"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text=""
                    android:textStyle="bold"
                    android:paddingTop="10dp"
                    android:textColor="#00A21E"
                    android:textSize="14dp"
                    android:paddingLeft="25dp"
                    android:layout_below="@+id/tvFN"
                    android:layout_toRightOf="@+id/imgFileIcon" />
            </RelativeLayout>
        </LinearLayout>
</RelativeLayout>

My List view XML layout:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity"
    android:background="@drawable/bginset3" >

    <ListView
        android:id="@+id/lvFiles"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
    </ListView>

</RelativeLayout>

My Java code:

package com.test.testing;

import java.io.File;
import java.util.ArrayList;
import java.util.Date;

import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Environment;
import android.text.Editable;
import android.text.TextWatcher;
import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

public class PreviousTrip extends Fragment {
    int i;
    String k = "";

    @Override
    public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState ) {
        final RelativeLayout mFrame3 =  (RelativeLayout) inflater.inflate( R.layout.ptrip, container, false );

        File folder = new File(Environment.getExternalStorageDirectory() + "/tc/");
        ListView lv;
        ArrayList<String> FilesInFolder = GetFiles(folder.getAbsolutePath());
        lv = (ListView) mFrame3.findViewById(R.id.lvFiles);

        lv.setAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, FilesInFolder));

        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                // Clicking on items
            Toast.makeText(getActivity(), "Item " + (position + 1) + ": ID" + v, Toast.LENGTH_SHORT).show();
             }
        });
        return mFrame3;
    }

    public ArrayList<String> GetFiles(String DirectoryPath) {
        ArrayList<String> MyFiles = new ArrayList<String>();
        File f = new File(DirectoryPath);


        //f.mkdirs();
        File[] files = f.listFiles();
        if (files.length == 0)
            return null;
        else {
            for (int i=0; i<files.length; i++)  {
                if (files[i].getName().endsWith(".tol")) {
                    long lastTime = files[i].lastModified();
                    String dateString = DateFormat.format("MM/dd/yyyy", new Date(lastTime)).toString();
                    String sizeString = getReadableSize(files[i].length());
                    String fileName = files[i].getName().substring(0, files[i].getName().lastIndexOf(".")); 
                    MyFiles.add("Trip Name: " + fileName + "\nTrip Taken On: " + dateString + "\n" + sizeString);
                }
            }
        }

        return MyFiles;
    }

    public String getReadableSize(long size) {
        String returnSize = "";

        if ((double) size / (1024 * 1024 * 1024) > 1.0) {
        double i = ((double) size / (1024 * 1024 * 1024)) * 100.0;
        long j = (long) i;
        double k = (double) j / 100.0;
        returnSize = k + " GB";
        } else if ((double) size / (1024 * 1024) > 1.0) {
        double i = ((double) size / (1024 * 1024)) * 100.0;
        long j = (long) i;
        double k = (double) j / 100.0;
        returnSize = k + " MB";
        } else if ((double) size / (1024) > 1.0) {
        double i = ((double) size / (1024)) * 100.0;
        long j = (long) i;
        double k = (double) j / 100.0;
        returnSize = k + " KB";
        } else {
        returnSize = size + " bytes";
        } 
        return returnSize;
    }
}

The above code produces a very plain looking format:

enter image description here

I would like some help in implementing CustomAdapter to use both XML file so I can make it like the following:

enter image description here

Christman answered 4/8, 2013 at 16:27 Comment(0)
B
1

You have to extend BaseAdapter. I'll provide you with some code from one of my past projects:

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class CustomAdapter extends BaseAdapter{

    private list_cons[] data;
    private static LayoutInflater inflater=null;

    public CustomAdapter(Context context, list_cons[] data){
        this.data=data;
        inflater= (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public int getCount(){
        return data.length;
    }

    public Object getItem(int position){
        return data[position];
    }

    public long getItemId(int position){
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent){

        View current= convertView;
        if(convertView==null)
            current = inflater.inflate(R.layout.list_item,null);

        TextView name = (TextView) current.findViewById(R.id.genre_name);
        ImageView imag = (ImageView) current.findViewById(R.id.list_image);

        //Setting all values in ListView

        name.setText(data[position].title);
        imag.setImageResource(data[position].image_id);

        return current; 

    }//end of method getView :)

}

list_item is the .xml where I defined the layout of each item in the list. list_cons is just a class from my project, which I used for storing data.

Bruxelles answered 4/8, 2013 at 16:41 Comment(2)
You got me wrong, This is not my activity class. This is my CustomAdapter class. In your activity, which extends Fragment or Activity or whatever, you findViewById() your ListView and call setAdapter(new CustomAdapter(params...)) on it.Bruxelles
Ok, so this is a different class which I have to create. But which like will I be replacing for the CustomAdapter class? Can you guide me a little? Thanks.Christman
W
1

http://www.josecgomez.com/2010/05/03/android-putting-custom-objects-in-listview/

have a great tutural for you and how to insert objects in a custom listview layout using an adapter. Its not as much code as it looks like. I've used this code and it was a breeze. In the list view adapter class you specify which textview to show the part on the object you want.

Winchester answered 4/8, 2013 at 23:54 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.