如何读取gridview click事件的行值并将它们传递给另一个片段

时间:2015-03-13 10:12:25

标签: android gridview

我在片段A中有一个包含3列的网格视图。我想读取click事件的第一个列值并将值传递给FragmentB。

如何阅读在网格视图上单击的行的第一列?

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_flight, container, false);
    // Inflate the layout for this fragment
    grid = (GridView) view.findViewById(R.id.gridView);
    MyAdapter myAdapter = new MyAdapter(getActivity());
    grid.setAdapter(myAdapter);
    grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            String place= (String) grid.getItemAtPosition(position);
            //How to read the first column value of the row clicked?
        }

    });

    return view;

}

grid_row.xml

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal">
    <TextView
        android:id="@+id/Destination"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <TextView
        android:id="@+id/Date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <TextView
        android:id="@+id/Description"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

fragment_flight.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" tools:context="com.test.FlightFragment">

<!-- TODO: Update blank fragment layout -->

<GridView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/gridView"
    android:layout_gravity="left|top"
    android:numColumns="3"
    android:horizontalSpacing="10dp"
    android:verticalSpacing="10dp"
    android:stretchMode="columnWidth"
    android:columnWidth="100dp"

   />

添加代码后

grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            if (position==0||position%3==0)
            {
              String place= (String) grid.getItemAtPosition(position);
              interfaceDataCommunicator.SendMarkerPlaceInfo(place);
            }

        }

我有错误

FATAL EXCEPTION: main
    java.lang.ClassCastException: com.test.FlightFragment cannot be cast to java.lang.String
            at com.test.FlightFragment.onItemClick(BurnScheduleFragment.java:51)
            at android.widget.AdapterView.performItemClick(AdapterView.java:301)
            at android.widget.AbsListView.performItemClick(AbsListView.java:1539)
            at android.widget.AbsListView$PerformClick.run(AbsListView.java:3332)
            at android.widget.AbsListView$1.run(AbsListView.java:4554)
            at android.os.Handler.handleCallback(Handler.java:725)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:176)
            at android.app.ActivityThread.main(ActivityThread.java:5279)

AdapterClass

 class MyAdapter extends BaseAdapter {

    ArrayList<Schedule> list;
    private Context context;

    MyAdapter(Context context) {
        this.context = context;
        list = new ArrayList();
        Resources resources = context.getResources();
        String[] tempDestination = resources.getStringArray(R.array.Destination);
        String[] tempDate = resources.getStringArray(R.array.Date);
        String[] tempDescription = resources.getStringArray(R.array.Description);
        for(int count=0;count<4;count++ ){
            Flight tempFlight = new Flight(tempDestination[count],tempDate[count],tempDescription[count]);
            list.add(tempFlight);
        }
    }

查看getView方法

public View getView(int position, View convertView, ViewGroup parent) {
        Schedule tempFlight = list.get(position);
        ViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.grid_row, parent, false);
            holder = new ViewHolder();
            holder.Destination = (TextView) convertView.findViewById(R.id.Destination);
            holder.Description = (TextView) convertView.findViewById(R.id.description);
            holder.Time =(TextView) convertView.findViewById(R.id.Date);
            convertView.setTag(holder);
        }

        else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.Destination.setText(tempFlight.Destination);
        holder.Description.setText(tempFlight.Description);
        holder.Time.setText(tempFlight.Time);

        return convertView;
    }

4 个答案:

答案 0 :(得分:0)

由于您只想读取第一列,而您的网格包含3列 即。

0 1 2
3 4 5
6 7 8
...

您将观察到,第一列只有索引'0'或3的倍数。

在方法OnClickListener中,您可以检查 int position的值。

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

            //How to read the first column value of the row clicked?
             if (position==0||position%3==0)
             {
              // Do whatever you want here
              String place= tempDestination[count];

             }

        }

    });

答案 1 :(得分:0)

在MyAdapter类中:

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

   String str = "some text";
    convertView.setTag(str);//you can pass any object in place of string

    return convertView;
}

现在抓住您活动中的价值,如下所示:

public void onItemClick(AdapterView<?> parent, View view,
                            int position, long id) {
     String = view.getTag();
 }

答案 2 :(得分:0)

你做错了

首先你必须得到视图(在你的情况下它应该是textview),然后得到

来自此textview的

E.g。

String contactId = ((TextView) view.findViewById(R.id.yourtextviewid)).getText().toString();

答案 3 :(得分:0)

使用 TextView textViewItem =((TextView)view.findViewById(R.id.Destination));给了我预期的结果。谢谢大家的帮助