java - android 中的 SimpleCursorAdapter

标签 java android simplecursoradapter

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

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

    }

}

最佳答案

改变你的构造函数如下

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

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

Activity

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

fragment

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

因此在 fragment 中获取上下文使用 getActivity()

public final Activity getActivity ()

Added in API level 11 Return the Activity this fragment is currently associated with.

还有

SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) This constructor was deprecated in API level 11. This option is discouraged, as it results in Cursor queries being performed on the application's UI thread and thus can cause poor responsiveness or even Application Not Responding errors. As an alternative, use LoaderManager with a CursorLoader.

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

关于java - android 中的 SimpleCursorAdapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25502092/

相关文章:

android - Framebuffer FBO 渲染到纹理非常慢,在 Android 上使用 OpenGL ES 2.0,为什么?

android - 如何在 Flutter 中折叠通知?使用本地推送通知插件和 CloudFunctions

Android 使用 CursorAdapter 保存和恢复列表状态

java - 如何在 Java 中将长计算字符串分离为可用计算

java - JBoss EAP 7.1 : ActiveMQ configuration - MDB with properties JMS not consuming message

java - Gradle:更改外部依赖项的配置

java - 输入流和输出流

java - 安卓 : How to use same AlarmManager in loop?

android - 如何从android中simplecursoradapter中的[]值拆分

Android 如何使用简单光标适配器/自定义光标适配器从数据库加载数据并将文本和图像放在一行中