2013-06-24 11 views
5

私は簡単な質問がありますが、解決できないようです。リストビュー項目を与えるカスタム配列アダプターなしのタグ

私はDragSortListViewを使用しています。私は、各listview-itemに元の場所のタグを付けたいと思います。ユーザーが並べ替えを完了すると、元のID(たとえば、ユーザーが最初の項目を最後の場所に移動した場合は2,3,4,1)の文字列を返します。アイテムが削除された場合は、オリジナルIDも知りたいと思います。

ここに私のコードです。

DragSortListView mainListView = (DragSortListView) findViewById(R.id.list_pages); 
String[] names = settings.getString("pages", "Error,error").split(",");  
ArrayList<String> list = new ArrayList<String>(Arrays.asList(names)); 
adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.row, list); 
mainListView.setAdapter(adapter); 
DragSortController controller = new DragSortController(mainListView); 
... 

ここで、すべてのアイテムをループして元のIDを持つタグを付けた方がよいと思っていました。私は、しかし、このリストビューでは、アダプターが設定されているにもかかわらず、空のように見えるこの

for (int i = 0; i < mainListView.getCount(); i++) 
{ 
    View v = mainListView.getChildAt(i); 
    TextView tx = (TextView) v.findViewById(R.id.text); 
    tx.setTag(i); 
} 

のようなものを使用してアイテムをループにしようとしています。

カスタムArrayAdapterを使用することはできません。アイテムをドロップまたはスワイプしたときにアプリケーションがクラッシュするためです。

追加情報: リストビューは、BroadcastReceiverを使用してサービスによってデータが返されたときに設定されます。私はこれに影響を与えるとは思わないが、あなたは決して知らない。

私の質問:

  • 私は後でそれにアクセスできるように、私は、各リスト項目の元の位置を保存するにはどうすればよいですか?

ありがとうございます!

答えて

8

カスタムAdapterを使用したくない場合は、ちょうどこのようにそれを行うことができます。

List<Item> dataForTheAdapter = new ArrayList<Item>(); 

    // 'dataRetrivedfromService' is the data, that gets returned by the service 
    for (int counter = 0; counter < dataRetrivedfromService.size(); counter++) { 
     dataForTheAdapter.add(new Item(dataRetrivedfromService.get(counter), counter)); 
    } 

    mContext = MyActivity.this; 
    mAdapter = new ArrayAdapter<Item>(mContext, R.layout.row, dataForTheAdapter); 

    ListView listView = (ListView) findViewById(R.id.listView); 
    listView.setAdapter(mAdapter); 

このコードはかなり自明です。 Item.javaクラスを見ると、toString()メソッドをオーバーライドしたことがわかります。 toString()メソッドは、ListViewがそのデータをいっぱいにする提供されたオブジェクトに対して呼び出されます。

public class Item { 

    private String mText; 
    private int mPosition; 

    public Item(String text, int position) { 

     this.mText = text; 
     this.mPosition = position; 
    } 

    public int getPosition() { 

     return mPosition; 
    } 

    public void setPosition(int position) { 

     this.mPosition = position; 
    } 

    public String getText() { 

     return mText; 
    } 

    public void setText(String text) { 

     this.mText = text; 
    } 

    @Override 
    public String toString() { 

     return this.mText; 
    } 
} 

これで、カスタムアダプタを作成する必要はなくなりましたが、アイテムのオブジェクトでListViewを埋め込むことができます。

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

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

       Toast.makeText(mContext, String.valueOf(mAdapter.getItem(position).getPosition()), Toast.LENGTH_SHORT).show(); 
      } 
     }); 
+0

本当に便利な答え、ありがとうアフマド:それが動作するかどうか、あなたはListViewOnItemClickListenerを設定し、これを行うことができ、これをテストするには

!これは別のアダプタなので、私の 'setDropListener()'と 'setRemoveListener()'はまだ変更されていますが、私はそれを理解します。すぐに私はこれを完全なものとしてマークします:)もう一度ありがとう! –

+0

完了!この答えは完璧でした。ありがとう! –

関連する問題