- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是我的代码:
PostTweetDialog.java
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.codepath.apps.mysimpletweet.models.Tweet;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.JsonHttpResponseHandler;
import org.apache.http.Header;
import org.json.JSONObject;
import java.util.ArrayList;
/**
* Created by AlecksJohanssen on 4/1/2016.
*/
public class PostTweetDialog extends DialogFragment {
private RestClient client;
private PostTweetInterface dialogFragment;
ArrayList<Tweet> tweets;
TweetArrayAdapter adapter;
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = getActivity().getLayoutInflater();
View dialogView = inflater.inflate(R.layout.post_tweet, null);
EditText etComposeTweet = (EditText) dialogView.findViewById(R.id.posttxt);
final String body = String.valueOf(etComposeTweet.getText());
tweets = new ArrayList<>();
adapter = new TweetArrayAdapter(tweets);
AlertDialog.Builder TweetDialog = new AlertDialog.Builder(getActivity());
TweetDialog.setTitle("Post Tweet");
TweetDialog.setView(dialogView)
.setPositiveButton("Continue", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
client.postTweet(body, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject json) {
Tweet myNewTweet = Tweet.fromJSON(json);
Log.d("DEBUG",String.valueOf(json.toString()));
tweets.add(myNewTweet);
adapter.notifyDataSetChanged();
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
Log.d("Error", errorResponse.toString());
}
});
}
}).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
dialogFragment.onDialogNegativeClick(PostTweetDialog.this);
}
});
return TweetDialog.create();
}
这是我的 PostTweet 方法:
public void postTweet(String body, AsyncHttpResponseHandler handler) {
String apiUrl = getApiUrl("statuses/update.json");
RequestParams params = new RequestParams();
params.put("status", body);
getClient().post(apiUrl, params, handler);
}
post_tweet.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/posttxt"
android:inputType="text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:layout_marginBottom="4dp"
android:hint="Input your Tweet here" />
</LinearLayout>
时间线 Activity .java
public class TimelineActivity extends AppCompatActivity {
private PostTweetDialog PostDialog = new PostTweetDialog();
private RestClient client;
private ArrayList<Tweet> Tweet;
private TweetArrayAdapter taAdapter;
private RecyclerView rvItems;
private TabLayout tabLayout;
private ViewPager viewPager;
private int[] tabIcons = {
R.drawable.ic_tab_favourite,
R.drawable.ic_tab_call,
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_timeline);
rvItems = (RecyclerView) findViewById(R.id.rvItems);
Tweet = new ArrayList<>();
taAdapter = new TweetArrayAdapter(Tweet);
rvItems.setAdapter(taAdapter);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
viewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);
tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
setupTabIcons();
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
rvItems.setLayoutManager(new LinearLayoutManager(this));
client = RestApplication.getRestClient();
populateTimeline(1);
rvItems.addOnScrollListener(new EndlessRecyclerViewScrollListener(linearLayoutManager) {
@Override
public void onLoadMore(int page, int totalItemsCount) {
populateTimeline(page);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
public void doThis(MenuItem item)
{
PostDialog.show(getFragmentManager(), "fragment_dialog");
}
private void populateTimeline(int page) {
client.getHomeTimeline(new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
Tweet.addAll(com.codepath.apps.mysimpletweet.models.Tweet.fromJSONArray(response));
int curSize = taAdapter.getItemCount();
taAdapter.notifyItemRangeInserted(curSize, Tweet.size() - 1);
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONArray errorResponse) {
}
}, page);
}
private void setupTabIcons() {
tabLayout.getTabAt(0).setIcon(tabIcons[0]);
tabLayout.getTabAt(1).setIcon(tabIcons[1]);
}
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.addFrag(new OneFragment(), "ONE");
adapter.addFrag(new TwoFragment(), "TWO");
viewPager.setAdapter(adapter);
}
class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFrag(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
}
}我不知道为什么我不能使用我的 postTweet 方法,它总是返回 null 值。这是错误 NullValue 的 gif
提前致谢:D。P/S:这一行显示为 null client.postTweet(body, new JsonHttpResponseHandler() {
最佳答案
正如评论中所述,您没有在对话框类中初始化客户端。您可以更改 Activity 代码以将客户端作为参数传递:
public class TimelineActivity extends AppCompatActivity {
private PostTweetDialog PostDialog;
private RestClient client;
private ArrayList<Tweet> Tweet;
private TweetArrayAdapter taAdapter;
private RecyclerView rvItems;
private TabLayout tabLayout;
private ViewPager viewPager;
private int[] tabIcons = {
R.drawable.ic_tab_favourite,
R.drawable.ic_tab_call,
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_timeline);
rvItems = (RecyclerView) findViewById(R.id.rvItems);
Tweet = new ArrayList<>();
taAdapter = new TweetArrayAdapter(Tweet);
rvItems.setAdapter(taAdapter);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
viewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);
tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
setupTabIcons();
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
rvItems.setLayoutManager(new LinearLayoutManager(this));
client = RestApplication.getRestClient();
PostDialog = new PostTweetDialog(client);
...
}
...
}
并向对话框类添加相应的构造函数:
public class PostTweetDialog extends DialogFragment {
private RestClient client;
private PostTweetInterface dialogFragment;
ArrayList<Tweet> tweets;
TweetArrayAdapter adapter;
public PostTweetDialog(RestClient client) {
this.client = client;
}
...
}
更新
为了解决您的问题,为什么 client
为 null
:
让我们看一下 PostTweetDialog 的代码...
在类的第一行中,您声明私有(private)变量client
:
private RestClient client;
然后在 onCreate
中设置使用该客户端
的onClick
回调。
TweetDialog.setView(dialogView)
.setPositiveButton("Continue", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
client.postTweet(body, new JsonHttpResponseHandler() { ... });
但是,在类 PostTweetDialog
中我找不到对该变量的赋值。因此,在 PostTweetDialog
中 client
始终未定义,即 null
。
由于您可能希望使用 Activity 使用的相同 RestClient
,因此您有多种选择。
client
引用传递给对话框类。OnClickListener
并在已有 客户端
的 Activity 中实现 onClick
。但随后您需要将 Activity 的引用传递给对话框类。关于java - postTweet 方法返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36371947/
最近开始学习oracle和sql。 在学习的过程中,我遇到了几个问题,我的 friend 在接受采访时被问到这些问题。 SELECT * FROM Employees WHERE NULL IS N
这个问题在这里已经有了答案: Can we subtract NULL pointers? (4 个回答) 关闭 2 个月前。 是否定义了NULL - NULL? (char *)NULL - (ch
是否有推荐的方法(根据 .net Framework 指南)检查 null,例如: if (value == null) {//code1} else {//code2} 或 if (value !=
我正在尝试将值插入数据库,但出现这样的错误任何人都可以告诉我为什么该值为空,如下所示: An exception occurred while executing 'INSERT INTO perso
这个问题在这里已经有了答案: String concatenation with a null seems to nullify the entire string - is that desire
您好,我正在 Android 联系人搜索模块中工作。我正在查询下方运行。 cur = context.getContentResolver().query(ContactsContract.Data.
下面的 SQL 表定义说明了从我的 MYSQL 数据库创建表的语句之一,该数据库是由我公司的前开发人员开发的。 DROP TABLE IF EXISTS `classifieds`.`category
我主要有应用程序开发背景。在编程语言中 variable == null或 variable != null有效。 当涉及到 SQL 时,以下查询不会给出任何语法错误,但也不会返回正确的结果。 sel
我在尝试检查某些元素是否为 NULL 时遇到段错误或不。任何人都可以帮忙吗? void addEdge(int i, int j) { if (i >= 0 && j > 0)
在 SQL 服务器中考虑到以下事实:Col1 和 Col2 包含数值和 NULL 值 SELECT COALESCE(Col1,Col2) 返回一个错误:“COALESCE 的至少一个参数必须是一个不
在 SQL 服务器中考虑到以下事实:Col1 和 Col2 包含数值和 NULL 值 SELECT COALESCE(Col1,Col2) 返回一个错误:“COALESCE 的至少一个参数必须是一个不
下面查询的关系代数表达式是什么?我找不到“Is Null”的表达式。 SELECT reader.name FROM reader LEFT JOIN book_borrow ON reader.ca
我正在尝试使用三元运算符来检查值是否为 null 并返回一个表达式或另一个。将此合并到 LINQ 表达式时,我遇到的是 LINQ 表达式的 Transact-SQL 转换试图执行“column = n
我在给定的代码中看到了以下行: select(0, (fd_set *) NULL, (fd_set *) NULL, (fd_set *) NULL, &timeout); http://linux
var re = /null/g; re.test('null null'); //> true re.test('null null'); //> true re.test('null null')
这个问题在这里已经有了答案: 关闭 13 年前。 我今天避开了一场关于数据库中空值的激烈辩论。 我的观点是 null 是未指定值的极好指示符。团队中有意见的其他每个人都认为零和空字符串是可行的方法。
由于此错误,我无法在模拟器中运行我的应用: Error:null value in entry: streamOutputFolder=null 或 gradle - Error:null value
我正在尝试在 Android 应用程序中创建电影数据库,但它返回错误。知道这意味着什么吗? public Cursor returnData() { return db.query(TABLE
我一直在检查浏览器中的日期函数以及运行时间 new Date (null, null, null); 在开发工具控制台中,它给出了有效的日期 Chrome v 61 回归 Sun Dec 31 189
为什么 NA==NULL 会导致 logical (0) 而不是 FALSE? 为什么 NULL==NULL 会导致 logical(0) 而不是 TRUE? 最佳答案 NULL 是一个“零长度”对象
我是一名优秀的程序员,十分优秀!