ParseQueryAdapter;在Android中使用类

时间:2015-05-01 13:55:48

标签: android parse-platform

我觉得自己的记录很糟糕。

经过多次尝试,我无法通过Parse数据获取列表视图以显示一组特定的信息。

这是我的模型......这是来自用户的所有数据:

@ParseClassName("Midwifefirm")
public class Midwifefirm extends ParseObject {



    public Midwifefirm() {
        // A default constructor is required.
    }

    //practice name
    public String getPracticeName() {
        return getString("practicename");
    }

    public void setPracticeName(String practicename) {
        put("practicename", practicename);
    }

    //education

    public String getEducation() {
        return getString("education");
    }

    public void setEducation(String education) {
        put("education", education);
    }

    //years in practice

    public String getYearsinPractice() {
        return getString("yearsinpractice");
    }

    public void setYearsinPractice(String yearsinpractice) {
        put("yearsinpractice", yearsinpractice);
    }

    //practice philosophy

    public String getPracticePhilosophy() {
        return getString("practicephilosophy");
    }

    public void setPracticePhilosophy(String practicephilosophy) {
        put("practicephilosophy", practicephilosophy);
    }

我有这个适配器;我想知道在查询部分放置什么,因为我只想将数据拉入数据模型中定义的ListView:

public class CustomMidwifeAdapter extends ParseQueryAdapter<Midwifefirm> {

    public CustomMidwifeAdapter(Context context) {
        super(context, new ParseQueryAdapter.QueryFactory<Midwifefirm>() {
            public ParseQuery<Midwifefirm> create() {
                // Here we can configure a ParseQuery to display
                // only top-rated meals.
                ParseQuery query = new ParseQuery("Midwives");

                return query;
            }
        });
    }


            @Override
            public View getItemView(Midwifefirm midwifefirm, View view, ViewGroup parent) {

                if (view == null) {
                    view = View.inflate(getContext(), R.layout.activity_midwife_result_list, null);

                }

                //use midwifefirm as item view/list

                super.getItemView(midwifefirm, view, parent);


                // find in layout the practice name
                TextView titleTextView = (TextView) view.findViewById(R.id.practicename);

                //in the midwifefirm data model, call getPracticename
                titleTextView.setText(midwifefirm.getString("practicename"));

                // Add education view
                TextView EducationView = (TextView) view.findViewById(R.id.education);

                EducationView.setText(midwifefirm.getString("education"));

                // Add yearsexperience view
                TextView ExperienceView = (TextView) view.findViewById(R.id.yearsinpractice);
                ExperienceView.setText(midwifefirm.getString("yearsinpractice"));

                //Add practice philosophy view
                TextView PracticePhilosophyView = (TextView) view.findViewById(R.id.practicephilosophy);
                PracticePhilosophyView.setText(midwifefirm.getString("practicephilosophy"));


                return view;
            }
}

这是主要活动:

public class MidwifeResultList extends ListActivity {


    private ParseQueryAdapter<ParseObject> mainAdapter;

    private CustomMidwifeAdapter midwifeListAdapter;





    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        //initialize main ParseQueryAdapter
        mainAdapter = new ParseQueryAdapter<ParseObject>(this, Midwifefirm.class);

        //which keys in Midwife object
        mainAdapter.setTextKey("practicename");
        mainAdapter.setTextKey("education");
        mainAdapter.setTextKey("yearsinpractice");
        mainAdapter.setTextKey("practicephilosophy");


        // Initialize the subclass of ParseQueryAdapter
        midwifeListAdapter = new CustomMidwifeAdapter(this);


        // Default view is all meals
        setListAdapter(mainAdapter);



    }

每次我跑这个,都没有结果。

提前感谢您提供任何帮助

迈克尔

2 个答案:

答案 0 :(得分:1)

我将使用Parse.com关于ParseQueryAdapters

的可爱的脑力争霸API帮助进行猜测。

在继续之前,我可以提醒您,我对ParseQueryAdapters的体验是最低限度的,但我认为我对它们有基本的了解+我对Parse有一些经验。总之,

作为一个例子,他们使用这两个

final ParseQueryAdapter adapter = new ParseQueryAdapter(this, "Midwives");
adapter.setTextKey("name");

ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(adapter);

// Instantiate a QueryFactory to define the ParseQuery to be used for fetching items in this
 // Adapter.
 ParseQueryAdapter.QueryFactory<ParseObject> factory =
     new ParseQueryAdapter.QueryFactory<ParseObject>() {
       public ParseQuery create() {
         ParseQuery query = new ParseQuery("Midwives");
         return query;
       }
     };

 // Pass the factory into the ParseQueryAdapter's constructor.
 ParseQueryAdapter<ParseObject> adapter = new ParseQueryAdapter<ParseObject>(this, factory);
 adapter.setTextKey("name");

 // Perhaps set a callback to be fired upon successful loading of a new set of ParseObjects.
 adapter.addOnQueryLoadListener(new OnQueryLoadListener<ParseObject>() {
   public void onLoading() {
     // Trigger any "loading" UI
   }

   public void onLoaded(List<ParseObject> objects, ParseException e) {
     // Execute any post-loading logic, hide "loading" UI
   }
 });

 // Attach it to your ListView, as in the example above
 ListView listView = (ListView) findViewById(R.id.listview);
 listView.setAdapter(adapter);

首先,我认为列表中没有任何内容加载的原因与ParseQueryAdapter的启动和自定义适配器之间的一些混淆有关。

您配置基本适配器,并初始化自定义适配器,但您不对自定义适配器执行任何操作,因此自定义适配器似乎包含加载数据模型的逻辑。

我认为你所寻找的是这样的:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    //initialize main ParseQueryAdapter
    mainAdapter = new CustomMidwifeAdapter<ParseObject>(this);

    //which keys in Midwife object
    mainAdapter.setTextKey("practicename");
    mainAdapter.setTextKey("education");
    mainAdapter.setTextKey("yearsinpractice");
    mainAdapter.setTextKey("practicephilosophy");

    // Default view is all meals
    setListAdapter(mainAdapter);
}

您需要传递的只是上下文(又名“this”),自定义类的构造函数将处理工厂内部

super(context, new ParseQueryAdapter.QueryFactory<Midwifefirm>() {
        public ParseQuery<Midwifefirm> create() {
            // Here we can configure a ParseQuery to display
            // only top-rated meals.
            ParseQuery query = new ParseQuery("Midwives");

            return query;
        }
    });

老实说,你做到了:

new ParseQueryAdapter<ParseObject>(this, Midwifefirm.class);

我想知道您是否需要将“QueryFactory”更改为

super(context, new ParseQueryAdapter.QueryFactory<Midwifefirm>() {
            public ParseQuery<Midwifefirm> create() {
                // Here we can configure a ParseQuery to display
                // only top-rated meals.
                ParseQuery query = new ParseQuery(MidWifefirm.class);

                return query;
            }
        });

你把一个类传递给查询而不是tableName,但我可能错了。

无论哪种方式,我希望这在某种程度上有所帮助!

答案 1 :(得分:1)

我可以告诉你为什么我认为它现在失败了,我可以告诉你为什么我很确定你在解决当前问题后会失败。

您似乎正在尝试使用不同的类

@ParseClassName("Midwifefirm")
public class Midwifefirm extends ParseObject {

ParseQuery query = new ParseQuery("Midwives");

您需要保持一致并使用相同的名称。两者都使用MidwivesMidwifefirm。我们假设您选择了后者。你也说

  

存储在用户表中的所有内容......不确定是否需要创建新表。

上面的查询想要获取Midwives类型的所有条目。如果没有这种类型,它将什么都不返回。所以你有两个选择:

  1. 在您的Parse仪表板中,创建一个班级Midwifefirm(不要忘记更新上方String内的@ParseClassName)并将Midwifefirm数据存储在其中。您无需为此更改查询。
  2. 在您的ParseUser课程中添加一栏,例如type,您可以设置为Midwifefirm,或者如果该用户是Midwifefirm或其他任何内容。然后在您的查询中,您需要添加:

    ParseQuery query = new ParseQuery("Midwives");
    query.whereEquals("type", "Midwifefirm");
    
  3. 我更喜欢前者。

    无论如何,一旦你完成了,问题是你没有使用自定义视图。您依赖于Android默认提供的ListActivity。我很确定它没有你要追踪的任何字段,所以你应该为此创建一个自定义视图,然后在onCreate的{​​{1}}顶部确保你使用它

    Activity

    顺便说一下,如果你随后在@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.my_custom_view); 中填充,则以下内容是多余的:

    getItemView

    最后一条建议:如果您仍有问题,请先设置断点并进行一些调查。您需要检查的是:

    1. 当你进行查询时,是否从Parse得到任何东西。您的适配器有一个有用的mainAdapter.setTextKey("practicename"); mainAdapter.setTextKey("education"); mainAdapter.setTextKey("yearsinpractice"); mainAdapter.setTextKey("practicephilosophy"); ,可用于检查是否已检索到任何内容。
    2. 如果成功检索到东西,则需要检查列表视图是否填充正确。再次,使用断点,这次可能在addOnQueryLoadListener