nath_vringd
nath_vringd

Reputation: 45

Trouble with fragments and adapter

I'm working on a little app which is supposed to display 3 screens : Talks, Papers and Choices. I've discovered fragments a few days ago and I would like to use this feature for my app, but unfortunately, it doesn't work for a particular reason…

My fragment:

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;
    }
}

My adapter :

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) {

    }


}

My XML files :

<?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>

If I leave

//lv.setAdapter(listAdapter);

commented, it loads, but as soon as I uncomment it, it crashes with the following error:

12-06 11:28:05.240: E/AndroidRuntime(1362): java.lang.ClassCastException: android.widget.TextView cannot be cast to android.widget.ListView

with reference to this precise line.

Upvotes: 0

Views: 351

Answers (2)

Nagaraja
Nagaraja

Reputation: 581

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);

Upvotes: 0

Thein
Thein

Reputation: 3968

You make cast checkBox to ListView !

It should be like that. ListView lv = (ListView) getActivity().findViewById(R.id.list);

Upvotes: 1

Related Questions