0

ListViewWeb サービスを使用して入力されたがあります。から特定のエントリを削除したいのですが、ListViewそのためには から要素の 1 つである ID (texview フィールド) を取得し、ListViewそれをデータベースに渡す必要があります。ImageViewそのエントリを削除するためにクリックする必要があるすべてのリスト要素に(赤い十字)があります。私が望むのは、同じリスト要素の削除イメージをクリックしたときにテキスト フィールドの値を取得することだけです。android:onClick関数を呼び出すために xml 属性を使用しましたdeleteEntry。しかし、削除イメージと同じリスト要素にある ID の特定の値を取得する方法がわかりません。どうやってやるの?

編集

これは私のアダプターです:

public class MyCustomAdapterWorkEntry extends ArrayAdapter<ViewWorkEntryBean> {


Context context;
int layoutResourceId;
ViewWorkEntryBean currentMRB;
Vector<ViewWorkEntryBean> data;

public MyCustomAdapterWorkEntry(Context context, int layoutResourceId, Vector<ViewWorkEntryBean> data) 
{
    super(context,layoutResourceId,data);
    this.layoutResourceId = layoutResourceId;
    this.context=context;
    this.data = data;
}

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

    View row = convertView;
    MyStringReaderHolder holder;


    if(row==null)
    {
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent,false);

        holder= new MyStringReaderHolder();

        holder.workLogID = (TextView)row.findViewById(R.id.worklog_id);

        holder.delete = (ImageView) row.findViewById(R.id.delete);

        row.setTag(holder);
    }
    else
    {
        holder=(MyStringReaderHolder) row.getTag();
    }


    ViewWorkEntryBean mrb = data.elementAt(position);

    holder.workLogID.setText(mrb.workLogID);

    holder.delete.setTag(mrb.workLogID);
    return row;
}

static class MyStringReaderHolder
{
TextView workLogID;
ImageView delete;

}
}

そして、これは削除機能です:

public void DeleteWorkEntryClick(View v) {


    String workLogID = null;        

    workLogID = (String) v.getTag();


    deleteWorkEntry(workLogID);

}

それはまだ動作しません !workLogID がヌルです。

4

3 に答える 3

1

同じリスト要素の画像の削除をクリックしたときに、テキストフィールドの値を取得するだけです。

関連するコードを投稿すると便利ですが、一般的なアプローチを次に示します。

行レイアウトが次のようになっていると仮定します。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

次のように、TextViewテキストを読み取るボタンのOnClickListenerを設定できます。

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
    public void onClick(View view) {
        LinearLayout parent = (LinearLayout) view.getParent();
        TextView textView = (TextView) parent.getChildAt(0);
        String text = textView.getText().toString();
        // text has what you want
    }
});

より将来を見据えた、しかし労働集約的なアプローチが必要な場合は、次のようにします。

TextView text = (TextView) parent.findViewById(R.id.text);
于 2012-07-16T19:36:44.663 に答える
1

を使用して、リスト内の各「X」ボタンのタグ値として関数に渡す必要がある特定の ID 値を設定しますsetTag()。そうすれば、クリックされたビューがonClick()メソッドに渡されるときに、呼び出しview.getTag()てその番号を再度取得し、DB 関数に渡すことができます。

于 2012-07-16T20:03:39.033 に答える
1

標準またはカスタムのいずれかの ListView を構築するためのアダプターを使用していると仮定しますが、実際には問題ではありません。

とは言っても、ListView からリスト項目を削除するのはアダプターの役割です。基本的に、アダプターには、リストから項目を削除し、データ セットが変更されたことを通知する removeItem メソッドが必要です。

コードの構造はわかりませんが、次のようになります。

public class YourAdapter extends BaseAdapter {

...

List<YourDataClass> list;

...

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    ...
}

...

public void removeItem(YourDataClass instance) {
    list.remove(instance);
    notifyDataSetChanged();
}

...
}

public class YourActivity extends Activity {

...

private ListView listView;
private YourAdapter yourAdapter;

...

private final OnItemClickListener listItemOnClickListener = new OnItemClickListener()     {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            YourDataClass itemToRemove = yourAdapter.getItem(position);
            yourAdapter.removeItem(itemToRemove);
    }
};

...

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    list.setOnItemClickListener(listItemOnClickListener);
    ...
}

...

}

重要なのは、 yourDataClass をオーバーライドする必要があることです。

public YourDataClass {

    ...

    @Override
    public boolean equals(Object obj) {...}

    @Override
    public int hashCode() {...}

    ...
}

あなたのコードを知らなくても、あなたのコードは特定の方法で構成されていると思いました。

ps。アイテム クリック リスナーを使用して例を作成しました。リスト アイテムのサブ ビューをクリック可能にして、デリクションを実行する場合は、ロジックをアダプターの getView メソッドに移動する必要があります。

于 2012-07-16T21:24:06.327 に答える