1

listView に問題があります。カスタム アダプター クラスを使用してリスト項目を表示しました。私の問題は、位置1のリストビューボタンをクリックすると、位置10のボタンもクリックされることです。この問題を解決するにはどうすればよいですか?

これが私のコードです:

public static class Clockin_Group extends BaseAdapter implements Filterable {

    private LayoutInflater mInflater;
    private Context context;


    public Clockin_Group(Context context) {
         mInflater = LayoutInflater.from(context);
          this.context = context;
    }
    @Override
    public int getCount() {         

         if(employeeList==null){
                return 0;
            }
            else{
                return employeeList.length;
            }

    }
    @Override
    public Object getItem(int position) {           
        return employeeList[position];
    }
    @Override
    public long getItemId(int position) {           
        return 0;
    }
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;    

         if (convertView == null){
             convertView = mInflater.inflate(R.layout.group_clkin_row, null);
             holder = new ViewHolder();
             convertView.setTag(holder);

         }

         else{
             holder = (ViewHolder) convertView.getTag();
          }


         holder.tv = (TextView) convertView.findViewById(R.id.group_name);
            holder.tv.setText(employeeList[position]);
            holder.tv1 = (TextView) convertView.findViewById(R.id.loc_id_tv);
            holder.tv1.setText("["+empNo_Array[position]+"]");
            holder.check = (ImageView) convertView.findViewById(R.id.checkmark);
       holder.check.setVisibility(View.GONE);
            holder.time = (TextView) convertView.findViewById(R.id.time);
            holder.time.setText("Last Clock " +punchType_array[position]+" "+"at"+" "+punchTime_array[position]);                   
            holder.clkin_tv = (TextView) convertView.findViewById(R.id.tv_clockin);
      holder.clkin_tv.setVisibility(View.GONE);
            holder.button = (Button) convertView.findViewById(R.id.group_button);

            holder.button.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    employee_id = Integer.parseInt(emp_idList[position]);
                       emp_selected = employeeList[position];
                       System.out.println("selected Emp.."+emp_selected);

                    boolean Status = false;
                       String type = "In";
                       SimpleDateFormat sdf = new SimpleDateFormat("MMMM dd, yyyy HH:mm:ss");
                          Date date=new Date();
                          String s=sdf.format(date);
                          System.out.println("GMT: "+s);


                      try {
                            Status = sendDetails(corpId, user_name, password,employee_id,location_id_str, task_id_str, "0", type);
                        } catch (ClientProtocolException e) {                   
                            e.printStackTrace();
                        } catch (IOException e) {                   
                            e.printStackTrace();
                        } catch (JSONException e) {                 
                            e.printStackTrace();
                        }

                       if(Status){

                            holder.button.setVisibility(View.INVISIBLE);
                               holder.clkin_tv.setVisibility(View.VISIBLE);
                               holder.time.setTextColor(Color.parseColor("#088A08"));
                               holder.check.setVisibility(View.VISIBLE);
                               holder.time.setText("Last Clock IN at "+sdf.format(new Date()).toString());
                               System.out.println("Status..");
                       }                       

                       else{
                           Toast.makeText(context, "Clock In Failed", Toast.LENGTH_SHORT).show();
                           holder.button.setVisibility(View.VISIBLE);
                              holder.clkin_tv.setVisibility(View.INVISIBLE);

                          }


                }
            });
            /*convertView.setOnClickListener(new OnClickListener() {
                //private int pos = position;

                @Override
                public void onClick(View v) {
                  //Toast.makeText(context, "Click-" + String.valueOf(pos), Toast.LENGTH_SHORT).show();    
                }
              });*/

            convertView.setOnTouchListener(new OnTouchListener() {

                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    Toast.makeText(context, employeeList[position]+"["+empNo_Array[position]+"]", Toast.LENGTH_SHORT).show();
                    return false;
                }
            });
          //  convertView.setTag(holder);



        return convertView;
    }
4

6 に答える 6

2

listView の高さと幅を wrap_content または fill_parent に設定して確認してください。

于 2012-07-27T07:53:56.370 に答える
1

実際にconvertView は、ビューを再利用するために概念が使用され、最初に 10 個のビューが作成され、リストonclickリスナーをスクロールしても更新されません。

このチュートリアルを使用onClickListenerして、各アイテムに異なるものを割り当てることができます

于 2012-07-27T06:46:31.550 に答える
1

ここでの問題は、リスト内のすべてのボタンが同じ ID を持つことです。onClik()ベース アダプターに書き込む代わりにonItemClickListener()、アイテムの位置を示すアクティビティを書き込むことができますListView

于 2012-07-27T06:39:34.623 に答える
1

タグを使用する必要があると思います。

すなわち

convertView.setTag(holder);

次に、 onClick 内でそこからタグとアクションを取得します

String currentPos = arg0.getTag().toString();
Integer.parseInt(currentPos)

それが理にかなっていることを願っています

于 2012-07-27T06:45:13.920 に答える
0

タグはホルダーではなくポジションキーでセットしてください。

変化する

convertView.setTag(holder);

convertView.setTag(position);

チェック..

于 2012-07-27T06:47:20.537 に答える
0

// アダプター内にセット関数を 1 つ書き込みます

public void setList(List<Employee> list) {
    mEmployeeList = list;
    notifyDataSetChanged();
} 

//Create a member variable. 
private List<Employee> mEmployeeList = new ArrayList<Employee>();

//Now in getView()

public View getView(int position, View convertView, ViewGroup parent) {
    /Use like this

    ViewHolder holder = (ViewHolder)convertView.getTag();
     final Employee employee= mEmployeeList.get(position);

//employee を使用してすべての変数を設定します。

     holder.button.setOnClickListener(new OnClickListener(){

      @Override
    public void onClick(View arg0) {
     Log.i("Adapter", employee.id);
       }});
}

// メイン クラスから setList 関数を呼び出し、employeeList を渡し、結果を知らせてください。

于 2012-08-24T13:31:34.930 に答える