【问题标题】:Remove row from listview using custom baseAdapter使用自定义 baseAdapter 从列表视图中删除行
【发布时间】:2012-12-01 06:29:15
【问题描述】:

您好,我有一个带有 CustomBaseAdapter 的 ListView。listview 内容 EditText 和 DeleteButton。现在我想删除按钮单击事件上的行。我尝试了 adapter.removeViewAt(int) 方法,但它给了我 AdapterView 不支持 removeViewAt(int) 的异常。我尝试了许多解决方案,但没有一个有效,请帮助我。

我得到以下错误日志 -

12-01 12:28:53.499: W/System.err(464): java.lang.UnsupportedOperationException: removeView(View) is not supported in AdapterView
12-01 12:28:53.499: W/System.err(464):  at android.widget.AdapterView.removeView(AdapterView.java:489)
12-01 12:28:53.499: W/System.err(464):  at android.view.View.performClick(View.java:2408)
12-01 12:28:53.499: W/System.err(464):  at android.view.View$PerformClick.run(View.java:8816)
12-01 12:28:53.499: W/System.err(464):  at android.os.Handler.handleCallback(Handler.java:587)
12-01 12:28:53.499: W/System.err(464):  at android.os.Handler.dispatchMessage(Handler.java:92)
12-01 12:28:53.509: W/System.err(464):  at android.os.Looper.loop(Looper.java:123)
12-01 12:28:53.519: W/System.err(464):  at android.app.ActivityThread.main(ActivityThread.java:4627)
12-01 12:28:53.519: W/System.err(464):  at java.lang.reflect.Method.invokeNative(Native Method)
12-01 12:28:53.519: W/System.err(464):  at java.lang.reflect.Method.invoke(Method.java:521)
12-01 12:28:53.519: W/System.err(464):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-01 12:28:53.519: W/System.err(464):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-01 12:28:53.519: W/System.err(464):  at dalvik.system.NativeStart.main(Native Method)

我的适配器是 -

公共类 LazyAdapter 扩展 BaseAdapter {

private Activity activity;   
private static LayoutInflater inflater=null;
private int noofrows;
private int LayoutRid;


static Map<Integer, String> Amt = new LinkedHashMap<Integer, String>();
static String AmtValue;


public LazyAdapter(Activity a, int rows, int Layoutid) {
    activity = a;       
    noofrows = rows;
    LayoutRid = Layoutid;
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);        
}


public int getCount() {
    return noofrows;
}

public Object getItem(int position) {
    return position;
}

public long getItemId(int position) {
    return position;
}


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

    ViewHolder holder = new ViewHolder();


    convertView = inflater.inflate(_LayoutRid, null );  

        holder.Amount = (EditText)convertView.findViewById(R.id.SESDedCCetDedAmount);

        holder.btnDel = (Button)convertView.findViewById(R.id.btnMinus);

        convertView.setTag(holder);     


        holder.Amount.setText(AmtValue == null? "" : AmtValue);
        holder.btnDel.setText(CodeValue == null? "" : CodeValue);


        holder.Amount.addTextChangedListener(new TextWatcher() {

            public void onTextChanged(CharSequence s, int start, int before, int count) {


            }

            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {

            }

            public void afterTextChanged(Editable s) {
                Amt.put(position, s.toString());
            }
        });


        holder.btnDel.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                // Take List from parent view
                ParentActivity.list.removeViewAt(position);
                notifyDataSetChanged();
            }
        });


    return convertView;
}

static class ViewHolder {

    EditText Amount;
    Button btnDel;

}

}

【问题讨论】:

  • 如果您确实在使用BaseAdapter,您的getCount() 方法会返回什么?
  • 是的,我的 getCount() 方法在列表中返回 noofrows。
  • 假设您的意思是某个集合中的“行数”,您是否尝试过删除集合中的特定索引?
  • @Niyati 发布您的适配器代码,以便我们为您提供更多帮助。
  • @Niyati 你的问题解决了吗?

标签: android listview baseadapter


【解决方案1】:

试试这个代码,

 btnOrImage.setOnClickListener(new OnClickListener() 
 {
    @Override
    public void onClick(View v) 
    {
        // delete query fire here whatever related to requirements.
        mList.remove(position);//you can delete your item here
        notifyDataSetChanged();
    }
});

此方法用于 notifyDataSetChanged() 从 BaseAdapter 刷新到 getView() 方法。

【讨论】:

  • 使用也可以用于arraylist和listview两者。
  • 对于 BaseAdapter 来说工作正常,您的应用程序的问题只是一步一步地查看所有代码。
  • 我试过了,但它给我的错误是 remove() 不适用于列表视图。
  • 我尝试了这样的解决方案(从适配器数组列表中删除数据然后刷新)但没有奏效。在这里打开另一个问题:stackoverflow.com/questions/38250987/…
【解决方案2】:
myHolder.btn_delete.setOnClickListener(new OnClickListener() 
{
    @Override
    public void onClick(View v) 
    {
      // remove data from List and call 
      notifyDataSetChanged(); <-- will remove old data
    }
});

【讨论】:

    【解决方案3】:

    试试这个,

    holder.delete.setOnClickListener(new OnClickListener() 
    
        {
            @Override
            public void onClick(View v) 
            {
                your_item.remove(position);//you can delete your item here
    
                notifyDataSetChanged();
            }
        });
    

    notifyDataSetChanged是刷新视图和更新数据。

    【讨论】:

      【解决方案4】:

      我试图从Arraylist 中删除它,但实际上我将它存储在Hashmap 中。我不得不从那里删除它:hashmap.remove(position); 解决了我的问题。

      【讨论】:

        猜你喜欢
        • 2013-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多