Android - 将项目从一个列表视图复制到另一个列表视图

问题描述:

我一直在研究这个Android项目,并一直在努力。我目前有两个列表视图,都显示数据。Android - 将项目从一个列表视图复制到另一个列表视图

我不确定如何将项目从一个列表视图复制到另一个项目单击时。

这里是我的代码:

public class MainActivity extends Activity { 

private ListView mListView1, mListView2; 

private String [] rock ={"The Beatles", "The Rolling Stones", "Jimi Hendrix", "Elvis Presley", "Pink Floyd", "AC/DC"}; 
private String [] pop ={"Michael Jackson", "Beyonce", "Rihanna", "Justin Bieber", "Lady Gaga", "Katy Perry"}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mListView1 = (ListView)findViewById(R.id.listView1); 
    mListView2 = (ListView)findViewById(R.id.listView2); 

    mListView1.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, rock)); 
    mListView2.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, pop)); 

    ListUtils.setDynamicHeight(mListView1); 
    ListUtils.setDynamicHeight(mListView2); 
} 


public static class ListUtils { 
    public static void setDynamicHeight(ListView mListView) { 
     ListAdapter mListAdapter = mListView.getAdapter(); 
     if (mListAdapter == null) { 
      // when adapter is null 
      return; 
     } 
     int height = 0; 
     int desiredWidth = MeasureSpec.makeMeasureSpec(mListView.getWidth(), MeasureSpec.UNSPECIFIED); 
     for (int i = 0; i < mListAdapter.getCount(); i++) { 
      View listItem = mListAdapter.getView(i, null, mListView); 
      listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); 
      height += listItem.getMeasuredHeight(); 
     } 
     ViewGroup.LayoutParams params = mListView.getLayoutParams(); 
     params.height = height + (mListView.getDividerHeight() * (mListAdapter.getCount() - 1)); 
     mListView.setLayoutParams(params); 
     mListView.requestLayout(); 
    } 
} 

}

,然后我的main.xml:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:fillViewport="true" > 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:padding="10dip" > 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center_vertical" 
     android:text="Rock" /> 

    <ListView 
     android:id="@+id/listView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="10dip" 
     android:background="#B29090" > 
    </ListView> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="10dip" 
     android:gravity="center_vertical" 
     android:text="Pop" /> 

    <ListView 
     android:id="@+id/listView2" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="10dip" 
     android:background="#4A9C67" > 
    </ListView> 
</LinearLayout> 

例如,当甲壳虫乐队被点击我想喜欢它被复制到弹出列表视图。

我试过使用这个(下面的例子找到另一个答案),但它不会工作,因为它表示该列表视图没有add()或notifyDataSetChange()方法。

listView1.setOnItemClickListener(this); 

public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    datasListView2.add(valuesListView1.get(position)); 
    listView2.notifyDataSetChange(); 
} 
+0

我不知道,但也许你应该做adapter.notifyDataSetChanged(); – Tuss

所以你有2个列表,摇滚和流行音乐吧?并且当您单击第一个listView(显示摇滚列表的项目)上的某个项目时,需要将该项目复制到第二个ListView(显示弹出列表的项目)。

您只需将该项添加到“弹出”列表,然后调用listview适配器上的notifyDataSetChange()。

public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    pop.add(rock.get(position)); 
    mListView2.getAdapter().notifyDataSetChange(); 
} 

这应该是很容易的,但也许你不希望修改“啪”列表,并仅在适配器中所示的列表?

在这种情况下,您应该在每个适配器中存储数组副本,这样您就可以在不影响主列表的情况下对其进行修改。

为了实现这一点,您需要继承所使用的适配器。

希望这会有所帮助。

private String [] rock ={"The Beatles", "The Rolling Stones", "Jimi Hendrix", "Elvis Presley", "Pink Floyd", "AC/DC"}; 
private String [] pop ={"Michael Jackson", "Beyonce", "Rihanna", "Justin Bieber", "Lady Gaga", "Katy Perry"}; 

private List rocklist = new ArrayList(); 
private List poplist = new ArrayList(); 
private ArrayAdapter adapterRock; 
private ArrayAdapter adapterPop; 
private ListView mListView1; 
private ListView mListView2; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    for(String a : rock){ 
     rocklist.add(a); 
    } 
    for (String b : pop){ 
     poplist.add(b); 
    } 

    mListView1 = (ListView)findViewById(R.id.listView1); 
    mListView2 = (ListView)findViewById(R.id.listView2); 
    adapterRock = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, rocklist); 
    mListView1.setAdapter(adapterRock); 
    adapterPop = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, poplist); 
    mListView2.setAdapter(adapterPop); 

    mListView1.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      poplist.add(rocklist.get(position)); 
      adapterPop.notifyDataSetChanged(); 
     } 
    }); 

} 
+0

试过这个,但是当我点击一个项目时,它似乎没有做任何不同的事情。这两个列表视图保持不变 – jf95

+0

我改变了它。 –

+0

如果arrayList的模型不同,我们如何将组件从一种类型移动到另一种类型。 –