Listview with arraylist, a simple adapter in android

I am trying to show something in a listview using an arraylist and a simple adapter. I tried something like below, but the last names of the arraist are displayed in my result. How wrong I am, I cannot understand.

final ListView listView = (ListView) findViewById(R.id.mylist); ArrayList<HashMap<String, String>> list_of_bookmarks = new ArrayList<HashMap<String, String>>(); HashMap<String, String> b = new HashMap<String, String>(); String[] from = { "php_key","c_key","android_key","hacking_key" }; String[] name_of_bookmarks = { "php","c","android","hacking" }; for(int i=0;i<4;i++) { b.put(from[i],name_of_bookmarks[i]); list_of_bookmarks.add(b); } }; int[] to = { R.id.txt1,R.id.txt1,R.id.txt1,R.id.txt1}; SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), list_of_bookmarks, R.layout.list_layout, from, to); listView.setAdapter(adapter); 

I just want to show "php", "c", "android", "hack" in the list. And what should be a more efficient way to do this. I am starting, so you can suggest the best way that I should follow

+7
android arraylist android-listview listview
source share
5 answers

main.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="60dp" > <ListView android:id="@+id/zone_list" android:layout_marginBottom="70dp" android:background="@drawable/batteryborder" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout> 

setlanguage.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="60dp"> <TextView android:id="@+id/tvName" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textSize="18dp" android:gravity="center_vertical" /> </LinearLayout> 

add onCreate () of your activity file

 ListView listView; String[] from = { "php_key","c_key","android_key","hacking_key" }; ArrayAdapter arrayAdapter; listView = (ListView) findViewById(R.id.zone_list); arrayAdapter = new ArrayAdapter(this,R.layout.setlanguage, R.id.tvName, from); listView.setAdapter(arrayAdapter); 
+7
source share

My advice for you will be to create a separate class that extends the Adapter (or some subclass of it)

Here is a simple example of a String array adapter.

 package ro.gebs.captoom.adapters; import android.content.Context; import android.view.View; import android.view.ViewGroup; import antistatic.spinnerwheel.adapters.AbstractWheelTextAdapter; import com.example.captoom.R; public class LanguagesAdapter extends AbstractWheelTextAdapter { // Countries names private String languages[]; public LanguagesAdapter(Context context) { super(context, R.layout.lang_item, NO_RESOURCE); languages = context.getResources().getStringArray(R.array.lang_array); setItemTextResource(R.id.language_txt); } @Override public View getItem(int index, View cachedView, ViewGroup parent) { View view = super.getItem(index, cachedView, parent); return view; } @Override public int getItemsCount() { return languages.length; } @Override protected CharSequence getItemText(int index) { return languages[index]; } } 

and simple use of the .setAdapter(); method .setAdapter();

Or another example that uses an arrayAdapter:

 package apc.example; import java.util.ArrayList; import utils.BitmapManager; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; public class PersonAdapter extends ArrayAdapter<Person> { Context context; int layoutResourceId; ArrayList<Person> data = null; public PersonAdapter(Context context, int layoutResourceId, ArrayList<Person> data) { super(context, layoutResourceId, data); this.layoutResourceId = layoutResourceId; this.context = context; this.data = data; } @Override public View getView(int position, View convertView, ViewGroup parent) { View row = convertView; ItemHolder holder = null; if (row == null) { LayoutInflater inflater = ((Activity) context).getLayoutInflater(); row = inflater.inflate(layoutResourceId, parent, false); holder = new ItemHolder(); holder.imgIcon = (ImageView) row.findViewById(R.id.icon); holder.txtName = (TextView) row.findViewById(R.id.title); holder.txtDescription = (TextView) row.findViewById(R.id.desc); row.setTag(holder); } else { holder = (ItemHolder) row.getTag(); } Person bean = data.get(position); holder.txtName.setText(bean.getName()); holder.txtDescription.setText(bean.getDescription()); Bitmap b = BitmapFactory.decodeResource(context.getResources(), R.drawable.user); BitmapManager.INSTANCE.setPlaceholder(b); BitmapManager.INSTANCE.loadBitmap(bean.getUrl(), holder.imgIcon, 80, 80); return row; } public static class ItemHolder { public ImageView imgIcon; TextView txtName; TextView txtDescription; } public void updateAdapter(ArrayList<Person> pers){ this.data = pers; } } 

This is an example adapter for a more complex class with more fields than a simple string. But this can easily be changed to an ArrayAdapter<String> , and then from there.

In any case, I believe that it is always recommended to write your own custom adapters for viewing lists.

Hope this helps!

+9
source share

You reuse the same view in the int [] object.

int[] to = { R.id.txt1,R.id.txt1,R.id.txt1,R.id.txt1};

It seems that they consider them as the same object, so every time he adds a new element, he changes the previous ones.

To use the SimpleAdapter , you will need to define each view in XML with different identifiers.

int[] to = { R.id.txt1,R.id.txt2,R.id.txt3,R.id.txt4};

SimpleAdapter may be simpler with respect to its internal complexity, but it is definitely not easier to use. With the ArrayAdapter you can simply pass it a list of elements and let it automatically generate views. It can be any size you need, until you run out of memory. (See below for example)

Once you get started with custom adapters, I highly recommend that you watch Romain Guy and the Adam Powell I / O talk . All this must be taken into account when training, but they do an excellent job of how ListViews work.

 //List of Items String[] name_of_bookmarks = { "php","c","android","hacking" }; //Create your List object for the ArrayAdapter //and make it the same size as name_of_books List<String> listBookmarks = new ArrayList<String>(Array.getLength(name_of_bookmarks)); //Add name_of_bookmarks contents to listBookmarks Collections.addAll(listBookmarks, name_of_books); //Create an ArrayAdapter passing it the Context, a generic list item and your list //An alternative to "this" would be "getApplicationContext()" from your main activity //or "getActivity()" from a fragment. "getBaseContext()" is not recommended. ArrayAdapter arrayAdapter = new ArrayAdapter(this, R.layout.list_item_text, listBookmarks); //Set the adapter to your ListView final ListView listView = (ListView) findViewById(R.id.mylist); listView.setAdapter(arrayAdapter); 
+2
source share

Try this one

  public class MyFragment extends ListFragment{ String[] from = { "php_key","c_key","android_key","hacking_key" }; String[] name_of_bookmarks = { "php","c","android","hacking" }; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { List<HashMap<String, String>> list= new ArrayList<HashMap<String,String>>(); for (int i = 0; i < name_of_bookmarks.length; i++) { HashMap<String, String> map= new HashMap<String, String>(); map.put("key", name_of_bookmarks[i]); list.add(map); } String[] from = { "key" }; int[] to = { R.id.txt}; SimpleAdapter adapter = new SimpleAdapter(getActivity().getBaseContext(), list, R.layout.list_layout, from, to); setListAdapter(adapter); return super.onCreateView(inflater, container, savedInstanceState); } } 
0
source share

Whatever you encounter the problem, I personally encounter a problem called "List View the display of the last position of the array data ..."

The problem is created using a hash map.

 final ListView listView = (ListView) findViewById(R.id.mylist); ArrayList<HashMap<String, String>> list_of_bookmarks = new ArrayList<HashMap<String, String>>(); String[] from = { "php_key","c_key","android_key","hacking_key" }; String[] name_of_bookmarks = { "php","c","android","hacking" }; for(int i=0;i<4;i++) { HashMap<String, String> b = new HashMap<String, String>(); b.put(from[i],name_of_bookmarks[i]); list_of_bookmarks.add(b); } }; int[] to = { R.id.txt1,R.id.txt1,R.id.txt1,R.id.txt1}; SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), list_of_bookmarks, R.layout.list_layout, from, to); listView.setAdapter(adapter); 

Try this if there is a doubt in consciousness, and then ask me what question again. Just you need to declare your hash map inside your loop ...

Using a hash map inside your b loop variable created each time it is treated as another object. And then just a list of arrays displays various hash map objects.

You use the same object to save the hash map value, and this variable was redefined with the same name that you encountered the problem Thanks ...

-one
source share

All Articles