如何在使用自定义 ListView 时一次只修改一行

How to modify only one row at a time while using Customized ListView

我使用的是自定义 ListView 而不是 ExtendedListView。我取 relative layout 是为了将其显示为 sub_list。默认情况下,我已将此 sub_list 相对布局的可见性设置为 GONE。并且在点击任何 listItemrelative layout(默认设置为 gone)将分别出现在屏幕上。但是当我单击任何行时,sub_list 同时出现在每一行中。我想要的是一次只显示一行。我已经检查了这个类似的 [question]: How to modify only one row at a time in Listview? 并修改了我的代码,但我仍然无法实现我的目标。

这是我的一段代码:

public class CustomAdapter extends BaseAdapter {

Activity context;
ArrayList<String> s_date,c_number,d_ration,s_time,download_path,a_number,a_name,dt_number;
int flag=0,temp=1,position;
String mUrl;
int posview;
private int selectedIndex;
CustomAdapter(Activity context, ArrayList<String> start_date, ArrayList<String> caller_number, ArrayList<String> duration,ArrayList<String> start_time, ArrayList<String> download_path, ArrayList<String> agent_number, ArrayList<String> agent_name,ArrayList<String> dt_num)
{

    this.context=context;
    this.s_date=start_date;
    this.c_number=caller_number;
    this.d_ration=duration;
    this.s_time=start_time;
    this.download_path=download_path;
    this.a_number=agent_number;
    this.a_name=agent_name;
    this.dt_number=dt_num;
    selectedIndex = -1;
}
public void setSelectedIndex(int ind)
{
    selectedIndex = ind;
    notifyDataSetChanged();
}

@Override
public int getCount() {

    return s_date.size();
}

@Override
public Object getItem(int i) {
    return null;
}

@Override
public long getItemId(int position) {

    return position;
}

public View getView(final int pos, final View v, ViewGroup g)
{
    //LayoutInflater l=context.getLayoutInflater();
    //View rowView=l.inflate(R.layout.log_layout,null,true);

    posview=pos;
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final View row = inflater.inflate(R.layout.list_item, g, false);


    TextView start_date = (TextView) row.findViewById(R.id.start_date);
    start_date.setText(s_date.get(pos));
    TextView caller_number = (TextView) row.findViewById(R.id.caller_number);
    caller_number.setText(c_number.get(pos));
    TextView duration = (TextView) row.findViewById(R.id.duration);
    duration.setText(d_ration.get(pos));
    TextView start_time = (TextView) row.findViewById(R.id.start_time);
    start_time.setText(s_time.get(pos));
    TextView agent_name = (TextView) row.findViewById(R.id.agent_name);
    agent_name.setText(a_name.get(pos));
    TextView agent_number = (TextView) row.findViewById(R.id.agent_number);
    agent_number.setText(a_number.get(pos));
    TextView dt_numb=(TextView)row.findViewById(R.id.dt_number);
    dt_numb.setText("MHL No. -"+dt_number.get(pos));

    RelativeLayout r = (RelativeLayout)row.findViewById(R.id.sub_layout);
    r.setVisibility(position == posview ? View.VISIBLE : View.GONE);

    row.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            posview=pos;
            notifyDataSetChanged();

        }
    });

    return row;

}

}

之前我的代码是:

          row.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {

            //setSelectedIndex(view.getId());
             RelativeLayout sub_list = (RelativeLayout) row.findViewById(R.id.sub_layout);
            sub_list.setVisibility(View.VISIBLE);
            //notifyDataSetChanged();


        }
    });

我正在动态获取所有数据。这就是我在 MainActivity:

中使用适配器的方式
    CustomAdapter a=new CustomAdapter(MainScreen.this,start_date,caller_number,duration,start_time,download_path,agent_number,agent_name,dt_number);
    data_list.setAdapter(a);

在这个 start_date caller_number 等中 arraylist.This 是我在 MainActivity.

中解析数据的方式
    JSONObject responseObject = new JSONObject(response);
                        JSONObject callLog = responseObject.getJSONObject("call_log");

                        Iterator<String> phoneNumbers = callLog.keys();


                        while (phoneNumbers.hasNext()) {
                            String number = phoneNumbers.next();
                           // Log.v("string number",number);
                            JSONObject numberLog = callLog.getJSONObject(number);
                            Iterator<String> callEntries = numberLog.keys();

                            while (callEntries.hasNext()) {
                                String entry = callEntries.next();

                                //Log.v("unique keys are",entry);
                                JSONObject entryObject = numberLog.getJSONObject(entry);
                                jsonArray.put(entryObject.getString("start_date"));
                                jsonArray.put(entryObject.getString("start_time"));
                                jsonArray.put(entryObject.getString("end_date"));
                                jsonArray.put(entryObject.getString("end_time"));
                                jsonArray.put(entryObject.getString("recording_path"));



                                String startDate = entryObject.getString("start_date");
                                start_date.add(startDate);
                                String startTime = entryObject.getString("start_time");
                                start_time.add(startTime);
                                String endDate = entryObject.getString("end_date");
                                String endTime = entryObject.getString("end_time");
                                String call_sdate = entryObject.getString("call_sdate");
                                String call_edate = entryObject.getString("call_edate");
                                String call_type = entryObject.getString("call_type");
                                String caller = entryObject.getString("caller");
                                caller_number.add(caller);
                                String duartion = entryObject.getString("duartion");
                                String call_duartion = entryObject.getString("call_duartion");
                                duration.add(call_duartion);
                                String dtmf = entryObject.getString("dtmf");
                                String dt_num = entryObject.getString("dt_number");
                                dt_number.add((dt_num));
                                String recording_path = entryObject.getString("recording_path");
                                download_path.add(recording_path);
                                String agent_mobile = entryObject.getString("agent_mobile");
                                agent_number.add(agent_mobile);
                                String a_name = entryObject.getString("agent_name");
                                agent_name.add(a_name);

您必须使用 ArrayList,当您单击该项目时,其内容将作为您的数据。

public class DataModel{
 private String s_date,c_number,d_ration,s_time,download_path,a_number,a_name,dt_number;
private boolean isChildVisible;            
..... create it's setter and getter methods.
}

当调用 itemclick 时,您应该更新该位置的 isChildVisible 标志。

public void setSelectedIndex(int ind)
{
   arrayListDataModel.get(ind).setIsChildVisible(true);
    notifyDataSetChanged();
}

在您的 getview 方法中:

   public View getView(final int pos, final View v, ViewGroup g)
    {
        ----your initialization code.    
        RelativeLayout r = (RelativeLayout)row.findViewById(R.id.sub_layout);
        r.setVisibility(arrayListDataModel.get(pos).isChildVisible() ? View.VISIBLE : View.GONE);

        row.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
    setSelectedIndex(pos);

            }
        });
    return row;
}

使用以下代码解析数据:

final ArrayList<DataModel> dataModelList = new ArrayList<>();
        while (callEntries.hasNext()) {
            DataModel  dataModel  = new DataModel();
            String entry = callEntries.next();

            //Log.v("unique keys are",entry);
            JSONObject entryObject = numberLog.getJSONObject(entry);
            jsonArray.put(entryObject.getString("start_date"));
            jsonArray.put(entryObject.getString("start_time"));
            jsonArray.put(entryObject.getString("end_date"));
            jsonArray.put(entryObject.getString("end_time"));
            jsonArray.put(entryObject.getString("recording_path"));


            String startDate = entryObject.getString("start_date");
            dataModel.setStartDate(startDate);
            String startTime = entryObject.getString("start_time");
            dataModel.setStartTime(startTime);
            ...... same as above for others fields

            dataModelList.add(dataModel);        

        }

您可以使用可扩展列表视图轻松实现此目的,您的适配器 class 应该扩展 BaseExpandableListAdapter

在activity

private int lastExpandedPosition = -1;

expListView.setOnGroupClickListener(new OnGroupClickListener() {

        @Override
        public boolean onGroupClick(ExpandableListView parent, View v,
                final int groupPosition, long id) {
            // TODO Auto-generated method stub

            if (parent.isGroupExpanded(groupPosition)) {

                expListView
                        .collapseGroup(lastExpandedPosition);
            } else {
                expListView.expandGroup(groupPosition);
            }

            return true;
        }
    });

    expListView.setOnGroupExpandListener(new OnGroupExpandListener() {

        @Override
        public void onGroupExpand(int groupPosition) {
            // TODO Auto-generated method stub
            if (lastExpandedPosition != -1
                    && groupPosition != lastExpandedPosition) {
                expListView
                        .collapseGroup(lastExpandedPosition);
            }
            lastExpandedPosition = groupPosition;
        }
    });

创建两个变量:

 Map<Integer, View> lastExpanded = new HashMap<>();
    int lastExpandedPosition =-1;

在您的适配器中创建一个函数:

private void expand(int i, View layout){
        if(!lastExpanded.containsKey(i)){
            layout.setVisibility(View.VISIBLE);
            lastExpanded.put(i, layout);

            if(lastExpanded.containsKey(lastExpandedPosition)){
                expand(lastExpandedPosition, lastExpanded.get(lastExpandedPosition));
            }
            lastExpanded.remove(lastExpandedPosition);
            lastExpandedPosition = i;
            lastExpanded.put(lastExpandedPosition, layout);
        }else{
            layout.setVisibility(View.GONE);
            lastExpandedPosition = -1;
            lastExpanded.remove(i);
        }
    }

现在,

final RelativeLayout layout = (RelativeLayout) row.findViewById(R.id.b);
        layout.setVisibility(View.GONE);
        row.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


                expand(i, layout);

            }
        });