ListFragment(或 Fragment)中的 BaseAdapter 不起作用

Posted

技术标签:

【中文标题】ListFragment(或 Fragment)中的 BaseAdapter 不起作用【英文标题】:BaseAdapter in ListFragment (or Fragment) doesn't working 【发布时间】:2015-03-07 08:11:06 【问题描述】:

我试图在一个 Activity 中显示一个列表视图并且它有效,但是当我尝试从一个从操作栏选项卡调用的片段中显示相同的列表视图时,我的程序没有运行。我曾尝试同时使用 Fragment 和 ListFragment,但即使使用我在 Internet 上找到的一些示例也无法使用。谁能帮帮我?

当我尝试启动带有操作栏的活动时遇到的错误:

01-09 03:10:37.807:E/androidRuntime(1248):致命异常:主要 01-09 03:10:37.807: E/AndroidRuntime(1248): java.lang.RuntimeException: 无法启动活动 ComponentInfocom.app/com.app.TelaPrincipal: java.lang.RuntimeException: 你的内容必须有id属性为'android.R.id.list'的ListView

那么,我需要在 TelaPrincipal.java 上创建任何列表吗?

TelaPrincipal.java

package com.app;


import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBar.Tab;
import android.support.v7.app.ActionBar.TabListener;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.SearchView;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.AutoCompleteTextView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;


public class TelaPrincipal extends ActionBarActivity 

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





        ActionBar ab = getSupportActionBar(); 
        ab.setDisplayHomeAsUpEnabled(true);
        ab.setDisplayShowTitleEnabled(true);

        //setupTabs();

        ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        Tab tab1 = ab.newTab();
        tab1.setTag("Professores");
        tab1.setText("Professores");
        tab1.setIcon(R.drawable.ac_professores);
        tab1.setTabListener(new NavegacaoTabs(new FListaProfessores()));
        ab.addTab(tab1);

        //Adicionar outras Tabs depois

    


    private class NavegacaoTabs implements TabListener 
        private Fragment frag;

        public NavegacaoTabs(Fragment frag)
            this.frag = frag;
        



        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) 
            // TODO Auto-generated method stub
            Log.i("Script", "onTabReselected()");

        

        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) 
            // TODO Auto-generated method stub
            getSupportActionBar().setTitle(tab.getTag().toString());

            FragmentTransaction fts = getSupportFragmentManager().beginTransaction();
            fts.replace(R.id.fragmentcontainer, frag);

            fts.commit();

        

        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) 
            // TODO Auto-generated method stub
            FragmentTransaction fts = getSupportFragmentManager().beginTransaction();
            fts.remove(frag);
            fts.commit();

        
        


tela_principal.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_
    android:layout_
    android:orientation="vertical"
    tools:context="$relativePackage.$activityClass" >

    <LinearLayout
        android:id="@+id/fragmentcontainer"
        android:layout_weight="100"
        android:layout_
        android:layout_
        android:orientation="vertical" >
    </LinearLayout>

</LinearLayout>

教授.java

package com.app;

public class Professor 
    private String nome;
    private String disciplina;


    private int avaliacoes;
    private int aprovacao;
    private int reprovacao;



    public String getNome() 
        return nome;
    
    public void setNome(String nome) 
        this.nome = nome;
    

    public String getDisciplina() 
        return disciplina;
    
    public void setDisciplina(String disciplina) 
        this.disciplina = disciplina;
    




    public int getAvaliacoes() 
        return avaliacoes;
    
    public void setAvaliacoes(int avaliacoes) 
        this.avaliacoes = avaliacoes;
    
    public int getAprovacao() 
        return aprovacao;
    
    public void setAprovacao(int aprovacao) 
        this.aprovacao = aprovacao;
    
    public int getReprovacao() 
        return reprovacao;
    
    public void setReprovacao(int reprovacao) 
        this.reprovacao = reprovacao;
    





professor.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="horizontal">

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical"
        android:layout_weight="10">

    </LinearLayout>

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="horizontal"
        android:layout_weight="1">

        <View
            android:layout_
            android:layout_
            android:background="@color/vermelho_linha">
        </View>

    </LinearLayout>



    <LinearLayout
    android:layout_
    android:layout_
    android:orientation="vertical"
    android:padding="5dp"
    android:layout_weight="89">

        <LinearLayout
            android:layout_
            android:layout_
            android:orientation="vertical">

             <RelativeLayout
                android:layout_
                android:layout_>

                    <TextView
                            android:id="@+id/professor_tvNome"
                            android:layout_
                            android:layout_
                            android:maxLines="2"
                            android:ellipsize="end"
                            android:layout_centerInParent="true"
                            android:textSize="28sp"
                            android:textColor="@color/preto"
                            android:text="TextView" />

                    </RelativeLayout>


        </LinearLayout>

         <LinearLayout
            android:layout_
            android:layout_
            android:orientation="vertical">

             <RelativeLayout
                android:layout_
                android:layout_>

                    <TextView
                         android:id="@+id/professor_tvDisciplina"
                         android:layout_
                         android:layout_
                         android:maxLines="2"
                         android:layout_centerInParent="true"
                         android:textSize="15sp"
                         android:ellipsize="end"
                         android:textColor="@color/preto"
                         android:text="TextView" />

                    </RelativeLayout>


        </LinearLayout>

          <LinearLayout
            android:layout_
            android:layout_
            android:orientation="horizontal"
            android:paddingTop="5dp">

              <LinearLayout
            android:layout_
            android:layout_
            android:layout_weight="50"
            android:orientation="vertical">

                  <RelativeLayout
                android:layout_
                android:layout_>

                    <TextView
                        android:id="@+id/professor_tvAvalicaoes"
                        android:layout_
                        android:layout_
                        android:textSize="15sp"
                        android:layout_centerInParent="true"
                        android:textColor="@color/preto"
                        android:text="TextView" />


                    </RelativeLayout>


        </LinearLayout>

              <LinearLayout
            android:layout_
            android:layout_
            android:layout_weight="50"
            android:orientation="vertical">

                  <RelativeLayout
                    android:layout_
                    android:layout_>

                    <TextView
                         android:id="@+id/professor_tvAprovacoes"
                         android:layout_
                         android:layout_
                         android:layout_centerInParent="true"
                         android:textSize="15sp"
                         android:textColor="@color/verde"
                         android:text="TextView" />


                    </RelativeLayout>

        </LinearLayout>

        </LinearLayout>

    </LinearLayout>

    </LinearLayout>

ProfessorAdapter.java

package com.app;

import java.lang.reflect.Array;
import java.util.ArrayList;




import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView.FindListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class ProfessorAdapter extends BaseAdapter 
    private Context context;
    private ArrayList<Professor> lista;


    public ProfessorAdapter(Context context, ArrayList<Professor> lista)
        this.context = context;
        this.lista = lista;
    


    @Override
    public int getCount() 
        return lista.size();
    

    @Override
    public Object getItem(int position) 
        return lista.get(position);
    

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 

        Professor professor = lista.get(position);
        View layout;



        if (convertView == null)
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            layout = inflater.inflate(R.layout.professor, null);
        
        else
            layout = convertView;
        

        TextView nomeProfessor = (TextView) layout.findViewById(R.id.professor_tvNome);
        nomeProfessor.setText(professor.getNome());

        TextView avaliacoesProfessor = (TextView) layout.findViewById(R.id.professor_tvAvalicaoes);
        avaliacoesProfessor.setText(professor.getAvaliacoes() + " avaliações");

        TextView disciplinaProfessor = (TextView) layout.findViewById(R.id.professor_tvDisciplina);
        disciplinaProfessor.setText(professor.getDisciplina());


        float porcentagemAprovacao = ( (float) professor.getAprovacao() / (float) professor.getAvaliacoes() ) *100;
        TextView aprovacoesProfessor = (TextView) layout.findViewById(R.id.professor_tvAprovacoes);



        if(porcentagemAprovacao >50)

            aprovacoesProfessor.setTextColor(Color.parseColor("#00FF00"));

        
        else

            aprovacoesProfessor.setTextColor(Color.parseColor("#FF0000"));
        

        String porcento = String.format("%.1f", porcentagemAprovacao);
        aprovacoesProfessor.setText(porcento + "% aprovações");




        return layout;
    


FListaProfessores.java

package com.app;


import java.util.ArrayList;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.ListFragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class FListaProfessores extends ListFragment 

    ProfessorAdapter adapter;
    private static ArrayList<Professor> professores = new ArrayList<Professor>();
    private static ListView lv;

    @Override
    public void onActivityCreated(Bundle savedInstanceState)
      super.onActivityCreated(savedInstanceState);


        fillProfessores(professores);
        adapter = new ProfessorAdapter(getActivity(), professores);



        setListAdapter(adapter);

        getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() 

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) 
                // TODO Auto-generated method stub

                Professor temp = (Professor) parent.getItemAtPosition(position);
                String nomeProfessor = (String) temp.getNome();

                Toast.makeText(getView().getContext(), "Professor " + nomeProfessor + " clicado", Toast.LENGTH_SHORT).show();


            



        );


    


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        View view = inflater.inflate(R.layout.flista_professores, null, false); 


        return (view);
    





public void fillProfessores(ArrayList<Professor> professores)

        Professor professor = new Professor();
        professor.setNome("Professor 1");
        professor.setDisciplina("Materia 1");
        professor.setAvaliacoes(125);
        professor.setAprovacao(83);
        professores.add(professor);

        Professor professor2 = new Professor();
        professor2.setNome("Professor 2");
        professor2.setDisciplina("Materia 2");
        professor2.setAvaliacoes(233);
        professor2.setAprovacao(182);
        professores.add(professor2);


    


flista_profes-s-res.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical" >


    
	            
            	<ListView
            		android:id="@+id/lista_professores"
		   	        android:layout_
		            android:layout_
		            android:scrollbars="vertical"
		            android:divider="@color/azul_linha"
		            android:dividerHeight="1dp"
		            style="@style/DropDownListView.Cadernotema">

		        	</ListView>
		        	

 </LinearLayout>

LogCat 消息

01-09 03:10:37.807: E/AndroidRuntime(1248): FATAL EXCEPTION: main
01-09 03:10:37.807: E/AndroidRuntime(1248): java.lang.RuntimeException: Unable to start activity ComponentInfocom.app/com.app.TelaPrincipal: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
01-09 03:10:37.807: E/AndroidRuntime(1248): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
01-09 03:10:37.807: E/AndroidRuntime(1248): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
01-09 03:10:37.807: E/AndroidRuntime(1248): 	at android.app.ActivityThread.access$600(ActivityThread.java:130)
01-09 03:10:37.807: E/AndroidRuntime(1248): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
01-09 03:10:37.807: E/AndroidRuntime(1248): 	at android.os.Handler.dispatchMessage(Handler.java:99)
01-09 03:10:37.807: E/AndroidRuntime(1248): 	at android.os.Looper.loop(Looper.java:137)
01-09 03:10:37.807: E/AndroidRuntime(1248): 	at android.app.ActivityThread.main(ActivityThread.java:4745)
01-09 03:10:37.807: E/AndroidRuntime(1248): 	at java.lang.reflect.Method.invokeNative(Native Method)
01-09 03:10:37.807: E/AndroidRuntime(1248): 	at java.lang.reflect.Method.invoke(Method.java:511)
01-09 03:10:37.807: E/AndroidRuntime(1248): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
01-09 03:10:37.807: E/AndroidRuntime(1248): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-09 03:10:37.807: E/AndroidRuntime(1248): 	at dalvik.system.NativeStart.main(Native Method)
01-09 03:10:37.807: E/AndroidRuntime(1248): Caused by: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
01-09 03:10:37.807: E/AndroidRuntime(1248): 	at android.support.v4.app.ListFragment.ensureList(ListFragment.java:344)
01-09 03:10:37.807: E/AndroidRuntime(1248): 	at android.support.v4.app.ListFragment.onViewCreated(ListFragment.java:145)
01-09 03:10:37.807: E/AndroidRuntime(1248): 	at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:961)
01-09 03:10:37.807: E/AndroidRuntime(1248): 	at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
01-09 03:10:37.807: E/AndroidRuntime(1248): 	at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
01-09 03:10:37.807: E/AndroidRuntime(1248): 	at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
01-09 03:10:37.807: E/AndroidRuntime(1248): 	at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:548)
01-09 03:10:37.807: E/AndroidRuntime(1248): 	at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1163)
01-09 03:10:37.807: E/AndroidRuntime(1248): 	at android.app.Activity.performStart(Activity.java:5018)
01-09 03:10:37.807: E/AndroidRuntime(1248): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2032)
01-09 03:10:37.807: E/AndroidRuntime(1248): 	... 11 more

【问题讨论】:

您发布了所有代码,但没有说明问题所在。只是说“不工作”是没有用的。 我已经更新了我认为是问题所在的地方。问题基本上是,当我使用 ListView 在 Activity 上运行此代码时,它会运行,而在 Fragment 或 ListFragment 上,它会在调用 ActivityHost 时崩溃。 请放崩溃的logcat跟踪 我不知道如何显示“11 more..”消息,够吗? 请看我的回答 【参考方案1】:

它崩溃了,因为您需要将 listview 的 id 设置为 android.R.id.list

像这样更改布局xml flista_professores

<?xml version="1.0" encoding="utf-8"?>
    <ListView
        android:id="@android:id/list"
        android:layout_
        android:layout_
        android:scrollbars="vertical"
        android:divider="@color/azul_linha"
        android:dividerHeight="1dp"
        style="@style/DropDownListView.Cadernotema">
    </ListView>

【讨论】:

我收到错误“解析 XML 时出错:未绑定前缀”。我在 listView 上添加了“xmlns:android="schemas.android.com/apk/res/android" 并且它起作用了!非常感谢你,我为此苦苦挣扎了两天,一遍又一遍地阅读所有 java 文件。 你知道大多数时候logcat错误足以得到错误。只需要了解它。 请注意,在我的代码中没有LinearLayout,只有带有列表名称的ListView,它正在工作,添加或不添加linearlayout有什么区别吗?【参考方案2】:

Logcat 说“你的内容必须有一个 id 属性为 'android.R.id.list' 的 ListView”

根据docListFragmant

your view hierarchy must contain a ListView object with the id "@android:id/list" (or list if it's in code)

是否在 flista_professores 布局中?

【讨论】:

以上是关于ListFragment(或 Fragment)中的 BaseAdapter 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

ListFragment 相对于 ListView 或普通 Fragment 的优势

Android ListFragment 游标管理

从 ListFragment android 启动另一个 Fragment

将 ListFragment 替换为 ViewPager 中的 Fragment 与选项卡

从 Fragment 获取 Activity 中的适配器

Android开发笔记(13)——ListFragment