【问题标题】:SimpleCursorAdapter in android安卓中的 SimpleCursorAdapter
【发布时间】:2014-08-26 09:13:07
【问题描述】:

这是我第一次创建安卓应用。我现在要创建的是创建一个列表,当用户单击列表中的名称时,将显示单击名称的详细信息。我正在尝试创建简单的光标适配器。但是出现错误

The constructor SimpleCursorAdapter(QuestionsNew, int, Cursor, String[], int[]) is undefined.

您认为可能的原因是什么。以下是我的部分代码

package tk.wew.wew;

import info.androidhive.sqlite.model.LocalStorage;
import info.androidhive.sqlite.model.Message;

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

import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.Fragment;
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.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

import static tk.askd.askd.CommonUtilities.*;

public class QuestionsNew extends Fragment {
    Cursor cursor;
    ListView nameList;
    protected ListAdapter adapter;
    // TextView tvCompany = (TextView)
    // findViewById(R.id.tvContactListCompany);
    private static final String TAG = "Question";

    private ListView list;

    private static List questions;

    ArrayList<String> senders = new ArrayList<String>(); 
    ArrayList<String> shortMsg = new ArrayList<String>();
    ArrayList<Integer> imageId = new ArrayList<Integer>();

    SimpleCursorAdapter myCursorAdapter;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view;

        //CommonUtilities.sendAQuestion(getActivity(), "msg123Kjjj11", "richmund_10023", "lofrancs1231", "Apil ka?");

        questions = CommonUtilities.getAllQuestions(getActivity(), "N", null);

        if(questions.size() > 0){
            view = inflater.inflate(R.layout.questions_main_layout, container, false);
            AskdDatabaseHelper msg_db = new AskdDatabaseHelper(getActivity());

            List<Message> messages = msg_db.getAllQuestions("N", "lofrancs1231");


            Cursor cursor = msg_db.getAllQuestions3();

         // Setup mapping from cursor to view fields:
            String[] fromFieldNames = new String[] { "KEY_MSG_MESSAGE_ID","KEY_MSG_MESSAGE"  };
            int[] toViewIDs = new int[] { R.id.KEY_MSG_MESSAGE_ID, R.id.KEY_MSG_MESSAGE_ID };

           /* SimpleCursorAdapter myCursorAdapter = new SimpleCursorAdapter(this, // Context
                            R.layout.message_list_item, // Row layout template
                            cursor, // cursor (set of DB records to map)
                            fromFieldNames, // DB Column names
                            toViewIDs // View IDs to put information in
            );*/

           myCursorAdapter = new SimpleCursorAdapter(QuestionsNew.this,
                    R.layout.message_list_item,
                    cursor,
                    fromFieldNames,
                    toViewIDs);

            ListView contactList = (ListView) getView().findViewById(R.id.lvContacts);
            contactList.setAdapter(myCursorAdapter);


            for(int m=0; m<questions.size(); m++){
                senders.add(messages.get(m).getFromUser());
                shortMsg.add(messages.get(m).getMessage());
                imageId.add(R.drawable.ic_launcher);
            }

        } else {
            view = inflater.inflate(R.layout.fragments_question_new, container, false);
            ((TextView)view.findViewById(R.id.textView)).setText("No New Questions");
        }      

        return view;
    }

    @Override
    public void onStart(){
        super.onStart();

        Log.v(TAG, ": New onStart");

        if(questions.size() > 0){

            list = (ListView) getView().findViewById(R.id.list);

            CustomLst adapter = new CustomLst(getActivity(), senders, imageId, shortMsg);

            list.setAdapter(adapter);

            list.setOnItemClickListener(new OnItemClickListener(){

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

//                  Cursor listCursor = (Cursor) parent.getItemAtPosition(position);
//                  Cursor listCursor = (Cursor) parent.getAdapter().getItem(position);
//                  Log.d("TAG", (String) parent.getItemAtPosition(id));

                    Toast.makeText(getActivity(), 
                            "Position:"+ parent.getItemIdAtPosition((int) id), Toast.LENGTH_LONG)
                            .show();

//                  int message = listCursor.getInt(listCursor.getColumnIndex(AskdDatabaseHelper.KEY_MSG_MESSAGE_ID));
                    /*   
                Intent intent = new Intent(getActivity(), QuestionDetail.class);
                    intent.putExtra("Message_ID", listCursor.getString(listCursor.getColumnIndex(AskdDatabaseHelper.KEY_MSG_MESSAGE_ID)));
                    startActivity(intent);
                    // ListView clicked item index
                    int Position = position;

                    // ListView clicked item value
                    String itemValue = (String) list.getItemAtPosition(Position);

                    // show alert
//                  Toast.makeText(getActivity(), 
//                          "Position:" + Position + " Listitem:" + itemValue, Toast.LENGTH_LONG)
//                          .show();
*/                  
                }

            });
        } else {
            Log.e(TAG, "No new question");
        }

    }

}

【问题讨论】:

    标签: java android simplecursoradapter


    【解决方案1】:

    如下改变你的构造函数

     myCursorAdapter = new SimpleCursorAdapter(getActivity(),
                    R.layout.message_list_item,
                    cursor,
                    fromFieldNames,
                    toViewIDs);
    

    第一个参数是Context。这个QuestionsNew.this 不是一个有效的上下文。片段不扩展Context

    活动

    java.lang.Object
       ↳    android.content.Context // check this
           ↳    android.content.ContextWrapper
               ↳    android.view.ContextThemeWrapper
                   ↳    android.app.Activity // check this
    

    片段

    java.lang.Object
       ↳    android.app.Fragment // check this
    

    所以在片段使用中获取上下文getActivity()

    public final Activity getActivity()

    在 API 级别 11 中添加 返回此片段当前所在的 Activity 相关联。

    还有

    SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) 此构造函数在 API 级别 11 中已弃用。此 不鼓励使用该选项,因为它会导致执行光标查询 在应用程序的 UI 线程上,因此可能导致响应速度不佳 甚至应用程序无响应错误。作为替代方案,使用 带有 CursorLoader 的 LoaderManager。

    在 Fragment 类中使用ArrayAdapter 时也是如此。 ArrayAdapter 的构造函数的第一个参数是一个有效的上下文。因此,即使在这种情况下,您也需要使用 getActivity() 而不是 FragmentName.this

    【讨论】:

    • 为什么应该写一些问答来解释这种差异,并将这些问题标记为重复。还是 +1
    • @blackbelt 完全同意。写一些规范的问题发布一个有效的答案,并将所有其他类似的帖子标记为重复。
    猜你喜欢
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多