片段和适配器的麻烦

时间:2013-12-06 12:53:25

标签: android android-fragments adapter

我正在开发一个应用程序,它应该显示3个屏幕:会谈,论文和选择。我几天前发现了片段,我想将这个功能用于我的应用程序,但不幸的是,它不适用于特定原因......

我的片段:

package info.androidhive.tabsswipe;
import java.io.IOException;
import java.util.List;
import be.unamur.confpers.beans.Paper;
import be.unamur.confpers.xml.XMLParser2;
import info.androidhive.tabsswipe.R;
import info.androidhive.tabsswipe.adapter.PaperAdapter;
import android.app.ListFragment;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import be.unamur.confpers.beans.Paper;
import be.unamur.confpers.xml.XMLParser2;
import be.unamur.confpers.*;

public class PapersFragment extends Fragment {

    private PaperAdapter listAdapter;
    private Context myContext;
    List<Paper> papers = null;

    private List<Paper> papersParser () {

        try {
            XMLParser2 parser = new XMLParser2();
            papers = parser.parse(getActivity().getApplicationContext().getAssets().open("talks.xml"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return papers;
    };

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.fragment_papers, container, false);

        ListView lv = (ListView) getActivity().findViewById(R.id.check1);
        listAdapter = new PaperAdapter(getActivity(),papers);
        //lv.setAdapter(listAdapter);

        return v;
    }
}

我的适配器:

package info.androidhive.tabsswipe.adapter;
import android.content.Context;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.LayoutInflater;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import be.unamur.confpers.beans.Paper;
import info.androidhive.tabsswipe.R;

import java.util.ArrayList;
import java.util.List;

public class PaperAdapter extends BaseAdapter implements OnClickListener {

    private Context context;
    private List<Paper> papers;
    private LayoutInflater inflater;

    public PaperAdapter(Context context, List<Paper> papers) {
        this.context = context;
        this.papers = papers;
        inflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount(){
        return papers.size();
    }

    @Override
    public Object getItem(int position) {
        return papers.get(position);
    }

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


    @Override
    public View getView(int position, View view, ViewGroup viewGroup) {

        // We only create the view if its needed
        if (view == null) {
            view = inflater.inflate(R.layout.child_row, null);

            // Set the click listener for the checkbox
            view.findViewById(R.id.check1).setOnClickListener(this);
        }

        Paper p = (Paper) getItem(position);

        // Set the example text and the state of the checkbox
        CheckBox cb = (CheckBox) view.findViewById(R.id.check1);
        //cb.setChecked(p.isSelected());
        // We tag the data object to retrieve it on the click listener.

        TextView paper = (TextView)view.findViewById(R.id.papername);
        if (paper != null)
            paper.setText(p.getTitle());

        TextView author = (TextView)view.findViewById(R.id.authorname);
        if( author!= null )
            author.setText( p.getAuthor() );

        return view;
    }

    /*@Override
    /** Will be called when a checkbox has been clicked. */
    public void onClick(View view) {

    }


}

我的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentTop="true" >

   <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" 
    android:layout_above="@+id/buttonsave" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

    <TextView
        android:id="@+id/papername"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
</LinearLayout>

<Button
    android:id="@+id/buttonsave"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:text="@string/btn_save" />

<Button
    android:id="@+id/buttonload"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:text="@string/btn_load" />
</RelativeLayout>

Group_row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:orientation="horizontal" >

<TextView
    android:id="@+id/papername"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="50dp"
    android:textSize="18sp"
    android:textStyle="bold" />

</LinearLayout>

Child_row.xml:

<?xml version="1.0" encoding="utf-8"?>

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:orientation="horizontal" 
android:shrinkColumns="0">

<!-- 2 columns -->

<TableRow
    android:id="@+id/tableRow1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="left"
    android:paddingLeft="20dp"
     >

    <CheckBox
        android:id="@+id/check1"
        android:layout_height="wrap_content"
        android:layout_width="30dp"
        android:focusable="false"
         />

    <TextView
        android:id="@+id/papername"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusable="false"
        android:textSize="16sp"
        android:textStyle="normal"
        android:layout_marginLeft="5dp" />
</TableRow>

<TableRow
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="50dp"
    android:paddingBottom="15dp" >

    <TextView
        android:id="@+id/authorname"
        android:layout_span="2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusable="false"
        android:textSize="16sp"
        android:textStyle="italic"
        android:layout_marginRight="5dp" />
</TableRow>

</TableLayout>

如果我离开

//lv.setAdapter(listAdapter);

注释,它会加载,但是一旦我取消注释它就会崩溃并出现以下错误:

  

12-06 11:28:05.240:E / AndroidRuntime(1362):java.lang.ClassCastException:android.widget.TextView无法强制转换为android.widget.ListView

参考这条精确的线。

2 个答案:

答案 0 :(得分:1)

您将CastBox复制到ListView!

应该是那样的。 ListView lv = (ListView) getActivity().findViewById(R.id.list);

答案 1 :(得分:0)

I gusse here is the error in  your code:

      @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {

            View v = inflater.inflate(R.layout.fragment_papers, container, false);

            ListView lv = (ListView) getActivity().findViewById(R.id.check1);
//Here your casting checkBox to Listview Pleas Check it out

            listAdapter = new PaperAdapter(getActivity(),papers);
            //lv.setAdapter(listAdapter);

            return v;
        }

just replace it like

 ListView lv = (ListView) v.findViewById(R.id.ListviewName);