【问题标题】:How to get data from custom adapter in ListView?如何从 ListView 中的自定义适配器获取数据?
【发布时间】:2014-06-04 10:15:01
【问题描述】:

这是我的问题:

我为我的 ListView 创建了一个自定义适配器,并从我提供给该适配器的 List 中获取信息,以便让他完成我的 ListView。他做的一切都是正确的。现在我想实现一个 OnItemClickListener 并从中获取数据。但在那个列表中,我有 4 个 TextViews ...

如何检索数据

我已经知道如何获取 id 和 position,因为我将它们显示在 Toast 中。

非常感谢您的帮助!

这是自定义适配器:

public class NextRdvAdapter extends ArrayAdapter<NextRdv> {
private List<NextRdv> listNextRdv = new ArrayList<NextRdv>(); 
private Context context; 

public NextRdvAdapter(List<NextRdv> nextRdvList, Context ctx) {
    super(ctx, R.layout.list_next_rdv, nextRdvList);
    this.listNextRdv = nextRdvList; 
    this.context = ctx;
} 

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

    if (convertView == null) { // This a new view we inflate the new layout 
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        convertView = inflater.inflate(R.layout.list_next_rdv, parent, false); 
        } // Now we can fill the layout with the right values 

    TextView tvTimeStart = (TextView) convertView.findViewById(R.id.next_time_start); 
    TextView tvTimeEnd = (TextView) convertView.findViewById(R.id.next_time_end); 
    TextView tvEnterprise = (TextView) convertView.findViewById(R.id.next_enterprise_name); 
    TextView tvAddress = (TextView) convertView.findViewById(R.id.next_address); 
    NextRdv rdv = listNextRdv.get(position); 

    tvTimeStart.setText(rdv.getStartTime());
    tvTimeEnd.setText(rdv.getEndTime());
    tvEnterprise.setText(rdv.getEnterprise());
    tvAddress.setText(rdv.getAddress());


    return convertView; 
    }
}

这是我的带有 ListView 的片段:

public class HomeFragment extends Fragment implements OnItemClickListener{

float density;

//Everything you need about this rdv
private ListView lvThisRdv;
private List<NextRdv> listThisRdv = new ArrayList<NextRdv>();
private NextRdvAdapter ThisRdvAdapter;  
private NextRdvListBouchon thisBouchon;

//Everything you need about next rdv
private ListView lvNextRdv;
private List<NextRdv> listNextRdv = new ArrayList<NextRdv>();
private NextRdvAdapter nextRdvAdapter;  
private NextRdvListBouchon bouchon;

public HomeFragment(){}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_home, container, false);


    lvThisRdv = (ListView)rootView.findViewById(R.id.listView_this_RDV);
    thisBouchon = new NextRdvListBouchon();
    listThisRdv = thisBouchon.getBouchonInc();
    ThisRdvAdapter = new NextRdvAdapter(listThisRdv, getActivity());
    lvThisRdv.setAdapter(ThisRdvAdapter);

    //Displaying the list of the next meetings
    lvNextRdv = (ListView)rootView.findViewById(R.id.listView_next_RDV);

    //Get test data
    bouchon = new NextRdvListBouchon();
    listNextRdv = bouchon.getBouchon();

    nextRdvAdapter = new NextRdvAdapter(listNextRdv, getActivity());
    lvNextRdv.setAdapter(nextRdvAdapter);

    lvNextRdv.setOnItemClickListener(new OnItemClickListener() {

          @Override
          public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {

              //
              Toast toast = Toast.makeText(getActivity(), "Pos : " +position+ " / id : " + id, Toast.LENGTH_SHORT);
              toast.show();
          }

    });

    return rootView;
}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
        long id) {
}
}

【问题讨论】:

    标签: android listview android-listview custom-adapter


    【解决方案1】:

    onItemClick 中,您可以使用AdapterView 参数,

    NextRdv item = (NextRdv) parent.getItemAtPosition(position)
    

    【讨论】:

    • 好的,我会试试的,感谢这个惊人的答案速度!!
    • 工作就像一个魅力,再次感谢您的速度和精度!
    • 所以这意味着适配器不仅会获取数据,还会保留列表中的项目?您是否有任何链接或任何主题可以解释我可以阅读的这一点?
    • 对不起,你能改写吗?
    • 感谢您提供的词汇,我将进一步研究这一点。祝你有美好的一天!
    【解决方案2】:

    你可以使用下面的代码

     lvNextRdv.setOnItemClickListener(new OnItemClickListener() {
    
          @Override
          public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
    
           // selected item
           String selected =((TextView)view.findViewById(R.id.your_textView_item_id)).getText().toString();
    
            Toast toast=Toast.makeText(getApplicationContext(), selected, Toast.LENGTH_SHORT);
            toast.show();
    
          }
    
    });
    

    使用这个你可以获取所选行的自定义适配器内任何 TextView 的数据。

    希望能帮到你……

    【讨论】:

    • 黑带答案更好。您必须再次初始化视图
    • 是的,这也是另一种方法
    • 感谢您的回答,但 Blackbelts 已经为我提供了一种对我来说似乎更方便的方法。不过感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多