Загрузить данные в представление списка Android с идентификатором записи и передать точный идентификатор записи onListItemClick - PullRequest
0 голосов
/ 13 сентября 2011

Я получаю свои данные из веб-службы и загружаю их в список. Который работает нормально. но когда я щелкаю по определенному элементу списка, мне нужно передать идентификатор этой записи (идентификатор должен исходить из базы данных) другому действию. Вот код, где я заполняю массив

public String[] getNames(String response){
    String[] friends = null;
    try {
        JSONObject json = new JSONObject(response);
        String values = json.getString("friends");
        JSONArray jsonArray = new JSONArray(values);
        friends = new String[jsonArray.length()];
        //Bundle b = new Bundle();
        for (int i = 0; i < jsonArray.length(); i++) {

            friends[i] =  jsonArray.getJSONObject(i).getString("fname")+ " " + jsonArray.getJSONObject(i).getString("lname") ;
            friends[i+1] = jsonArray.getJSONObject(i).getString("id");
            //i++;  
            //friends[i]= jsonArray.getJSONObject(i).getString("id");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return friends;
}

Это код, который я пытаюсь получить имя и идентификаторы

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    // Get the item that was clicked
    Object o = this.getListAdapter().getItem(position);
    String name = o.toString();
    Object x = this.getListAdapter().getItem(position+1);
    String userid= x.toString();
    Toast.makeText(this, "You selected: " + name +"The Id: "+userid, Toast.LENGTH_LONG)
            .show();
}

Это мой 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="wrap_content"
android:orientation="horizontal"
android:background="#ffffff"
>
<ImageView
android:id="@+id/icon"
android:padding="2dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/man"
/>
<TextView
android:id="@+id/txtName"
android:layout_width="210px"
android:layout_height="60px"
    android:padding="4dp"
    android:textSize="12sp" 
    android:textColor="#000000" 
    android:background="#ffffff"
/>

</LinearLayout>

Вот так я заполняю список

public void setTheList(String response){
        String friends[] = getNames(response);
        ListView lv = getListView();
        lv.setTextFilterEnabled(true);
        if(adapter==null){
            LayoutInflater inflater = getLayoutInflater();
            ViewGroup header = (ViewGroup)inflater.inflate(R.layout.header, lv, false);
            lv.addHeaderView(header, null, false);
        }

        adapter = new MyArrayAdapter(this, friends);
        this.setListAdapter(adapter);

    }

}

Это мой адаптер. Я получил это от здесь

package virtualpathum.web;

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;

public class MyArrayAdapter extends ArrayAdapter<String> {
    private final Activity context;
    private final String[] names;

    public MyArrayAdapter(Activity context, String[] names) {
        super(context, R.layout.friend, names);
        this.context = context;
        this.names = names;
    }

    // static to save the reference to the outer class and to avoid access to
    // any members of the containing class
    static class ViewHolder {
        public ImageView imageView;
        public TextView textView;
        public ImageButton ibConfirm;
        public ImageButton ibNotNow;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // ViewHolder will buffer the assess to the individual fields of the row
        // layout

        ViewHolder holder;
        // Recycle existing view if passed as parameter
        // This will save memory and time on Android
        // This only works if the base layout for all classes are the same
        View rowView = convertView;
        if (rowView == null) {
            LayoutInflater inflater = context.getLayoutInflater();
            rowView = inflater.inflate(R.layout.friend, null, true);
            holder = new ViewHolder();
            holder.textView = (TextView) rowView.findViewById(R.id.txtName);
            holder.imageView = (ImageView) rowView.findViewById(R.id.icon);
            //holder.ibConfirm = (ImageButton) rowView.findViewById(R.id.ibNotNow);
            //holder.ibNotNow= (ImageButton) rowView.findViewById(R.id.ibNotNow);
            rowView.setTag(holder);
        } else {
            holder = (ViewHolder) rowView.getTag();
        }

        holder.textView.setText(names[position]);
        // Change the icon for Windows and iPhone
        String s = names[position];
        holder.imageView.setImageResource(R.drawable.man);

        return rowView;
    }
}

Действительно признателен, если у вас есть представление об этом Спасибо Pathum

Ответы [ 5 ]

1 голос
/ 14 сентября 2011

Большое спасибо за предоставленную поддержку.Я использовал подход, который @Richard предоставил с помощью концепции тега @ rafael-t.Спасибо @ yashwanth-kumar за объяснение.Ниже приведены изменения, внесенные в мои исходные коды

public ArrayList<Object> getNames(String response){
        ArrayList<Object>  arrList = null;
        try {
            JSONObject json = new JSONObject(response);
            String values = json.getString("friends");
            JSONArray jsonArray = new JSONArray(values);
            arrList = new ArrayList<Object>();
            for (int i = 0; i < jsonArray.length(); i++) {  
                arrList.add(new User(jsonArray.getJSONObject(i).getString("id"),jsonArray.getJSONObject(i).getString("fname"),jsonArray.getJSONObject(i).getString("lname"),jsonArray.getJSONObject(i).getString("email")));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return arrList;
    }

. Это мой метод getNames. Я добавил все значения в пользовательский объект.Спасибо @Richard.

Вот мой пользовательский адаптер для этого изменения

package virtualpathum.web;

import java.util.ArrayList;
import java.util.Iterator;

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;

public class MyArrayAdapter extends ArrayAdapter<ArrayList<Object>> {
    private final Activity context;
    private final ArrayList names;

    @SuppressWarnings("unchecked")
    public MyArrayAdapter(Activity context, ArrayList names) {
        super(context, R.layout.friend, names);
        this.context = context;
        this.names = names;
    }

    // static to save the reference to the outer class and to avoid access to
    // any members of the containing class
    static class ViewHolder {
        public ImageView imageView;
        public TextView textView;
        public ImageButton ibConfirm;
        public ImageButton ibNotNow;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // ViewHolder will buffer the assess to the individual fields of the row
        // layout

        ViewHolder holder;
        // Recycle existing view if passed as parameter
        // This will save memory and time on Android
        // This only works if the base layout for all classes are the same
        View rowView = convertView;
        if (rowView == null) {
            LayoutInflater inflater = context.getLayoutInflater();
            rowView = inflater.inflate(R.layout.friend, null, true);
            holder = new ViewHolder();
            holder.textView = (TextView) rowView.findViewById(R.id.txtName);
            holder.imageView = (ImageView) rowView.findViewById(R.id.icon);
            //holder.ibConfirm = (ImageButton) rowView.findViewById(R.id.ibNotNow);
            //holder.ibNotNow= (ImageButton) rowView.findViewById(R.id.ibNotNow);
            rowView.setTag(holder);
        } else {
            holder = (ViewHolder) rowView.getTag();
        }
        String [] frndNames = new String[names.size()];
        int count = 0;
        for (@SuppressWarnings("rawtypes")
        Iterator iterator = names.iterator(); iterator.hasNext();) {
            User user = (User) iterator.next();
            frndNames[count] = user.getFirstname()+" "+user.getLastname();
            count++;
        }
        String [] frndIds = new String[names.size()];
        int idCount = 0;
        for (@SuppressWarnings("rawtypes")
        Iterator iterator = names.iterator(); iterator.hasNext();) {
            User user = (User) iterator.next();
            frndIds[idCount] = user.getUserid();
            idCount++;
        }
        holder.textView.setText(frndNames[position]);
        holder.textView.setTag(frndIds[position]);
        holder.imageView.setImageResource(R.drawable.man);

        return rowView;
    }
} 

Это слушатель по щелчку

@Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        // Get the item that was clicked
        String userid = (String) v.findViewById(R.id.txtName).getTag();
        Toast.makeText(this, "Selected user ID = "+userid , Toast.LENGTH_LONG)
                .show();
    }

Я все еще чувствую, что это может быть дальшеоптимизировать для лучшей производительности, но на данный момент это более чем достаточно для меня.Еще раз спасибо, ребята.

1 голос
/ 13 сентября 2011

Вместо getnames, возвращающих String [], создайте класс, представляющий человека вместе с идентификатором, и верните ArrayList

class Person {
   String name;
   int id;
   public Person(int id, String name){
   //Implement
   }
   //Implement getters and setters      
}

//Consider renaming to getPersons
ArrayList<Person> person = getNames();

getNames(String inputString)
{
   ...
   ArrayList<Person> persons = new ArrayList...
   persons.add(new Person("Brother",2)
   persons.add(new Person("Jonas",1)
   return persons;
}

ArrayAdapter<Person> arrayadapter = new YourArrayAdapter<Person>();
arrayadapter.addAll(getNames(inputString);


In you arrayadapter you override the getItemId
@Overide
getItemId(int position)
{
   return getItem(position).getItemId();
}

(я предполагаю, что вы используете ArrayAdapter или что-то подобное)

Изатем в вашем массиве реализуйте getId и getItem соответственно

0 голосов
/ 14 сентября 2011

хорошо, вот что вы делаете, добавьте нового члена в ваш класс владельца, давайте предположим, что ваш тип данных id - строка.затем добавьте

public String mId;

в держатель.и заполните его соответствующим идентификатором представления перед возвратом из getView.

holder.mId = Id_which_you_need;

в onItemClickListener, используйте его, чтобы получить тег.как мы и предполагали, это строка.

id = holder.mId;

id - это то, что вам нужно. Это все, что вам нужно, есть и другие способы, так как вы используете теги, я подумал, что это будет лучше.

0 голосов
/ 13 сентября 2011

Насколько я понимаю, у вас нет проблем с возвращением идентификатора.Тем не менее, вы можете предоставить тег для любого представления (чтобы вы могли передать идентификатор как тег внутри LinearLayout).Затем, если у вас есть свой идентификатор, вы можете начать свою новую активность следующим образом:

Intent intent = new Intent(getContext(), YOUR_ACTIVITY_YOU_WANNA_START.class);
intent.putExtra("ID", userid);
startActivity(0, intent);

в получающей деятельности (в данном случае YOUR_ACTIVITY_YOU_WANNA_START.class), которую вы вызываете, возможно, в onCreate ()

Intent intent = getIntent();
String userId = intent.getExtra("ID" , "DEFAULT");
0 голосов
/ 13 сентября 2011

В случае длинного щелчка у вас есть параметр позиции.Где бы вы ни хранили свои данные, вы можете получить их с помощью этого параметра.Для получения дополнительной помощи вам, вероятно, следует добавить некоторую информацию о типе используемого вами адаптера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...